func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 2e5 + 5;   const int inf = 1e9 + 7;   long long minv[1 << 16];   long long numx[15], numy[15];   long long n, a[maxn], x, y, A, B, facy[15000], ans;   inline long long read() {     char ch = getchar();     long long u = 0, f = 1;     while (!isdigit(ch)) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (isdigit(ch)) {       u = u * 10 + ch - 48;       ch = getchar();     }     return u * f;   }   inline long long gcd(long long x, long long y) {     return y == 0 ? x : gcd(y, x % y);   }   inline long long mul(long long x, long long y, long long p) {     long long cnt = 0;     while (y) {       if (y & 1) cnt = (cnt + x) % p;       x = (x + x) % p;       y >>= 1;     }     return cnt;   }   inline long long ksm(long long x, long long k, long long p) {     long long cnt = 1;     while (k) {       if (k & 1) cnt = mul(cnt, x, p);       x = mul(x, x, p);       k >>= 1;     }     return cnt;   }   inline bool judge(long long a, long long p) {     long long q = p - 1;     int k = 0;     while (q % 2 == 0) ++k, q >>= 1;     long long v = ksm(a, q, p);     if (v == 1 || v == p - 1) return false;     while (k-- != 0) {       v = mul(v, v, p);       if (v == p - 1) return false;     }     return true;   }   inline bool miller_rabbin(long long p) {     if (p == 2) return true;     if (p % 2 == 0) return false;     for (register int i = 1; i <= 60; i++) {       long long a = rand() % (p - 1) + 1;       if (judge(a, p)) return false;     }     return true;   }   const int M = (1 << 7) - 1;   inline long long pollard_rho(long long n) {     if (n % 2 == 0) return 2;     if (n % 3 == 0) return 3;     long long x = 0, y = x, t = 1, q = 1, a = (rand() % (n - 1)) + 1;     for (int k = 2;; k <<= 1, y = x, q = 1) {       for (int i = 1; i <= k; ++i) {         x = (mul(x, x, n) + a) % n;         q = mul(q, abs(x - y), n);         if (!(i & M)) {           t = gcd(q, n);           if (t > 1) break;         }       }       if (t > 1 || (t = gcd(q, n)) > 1) break;     }     if (t == n) {       t = 1;       while (t == 1) t = gcd(abs((x = ((mul(x, x, n) + a) % n)) - y), n);     }     return t;   }   inline void findfac(long long x) {     if (x == 1) return;     if (miller_rabbin(x)) {       facy[++facy[0]] = x;       return;     }     long long p = x;     while (p >= x) p = pollard_rho(p);     findfac(p);     findfac(x / p);   }   inline void dEBUG(long long *x, long long len) {     cerr <<  ----------------------------------DEBUG-----------------------------               -----           << endl;     for (register int i = 0; i <= len; i++) cerr << x[i] <<    ;     cerr << endl;     cerr <<  ----------------------------------DEBUG-----------------------------               -----           << endl;   }   int main() {     srand(19260817);     n = read();     A = x = read();     B = y = read();     if (y % x != 0) {       cout << 0;       return 0;     }     for (register int i = 1; i <= n; i++) a[i] = read();     if (B != 100000000000123502ll) {       findfac(B);       sort(facy + 1, facy + 1 + facy[0]);       facy[0] = unique(facy + 1, facy + 1 + facy[0]) - facy - 1;     } else {       for (register int i = 2; 1ll * i * i <= B; i++) {         if (B % i == 0) facy[++facy[0]] = i;         while (B % i == 0) B /= i;       }       if (B != 1) facy[++facy[0]] = B;       B = y;     }     for (register int i = 1; i <= facy[0]; i++)       while (B % facy[i] == 0) B /= facy[i], numy[i]++;     for (register int i = 1; i <= facy[0]; i++)       while (A % facy[i] == 0) A /= facy[i], numx[i]++;     for (register int i = 1; i <= n; i++) {       if (a[i] % x != 0) continue;       int maskx = 0;       long long T = a[i];       for (register int k = 1; k <= facy[0]; k++) {         int p = 0;         if (numx[k] == numy[k]) continue;         while (T % facy[k] == 0) T /= facy[k], p++;         maskx |= ((p > numx[k]) << (k - 1));       }       minv[maskx]++;     }     for (register int i = 0; i < facy[0]; i++)       for (register int G = 0; G < (1 << facy[0]); G++)         if (G & (1 << i)) minv[G] += minv[G ^ (1 << i)];     int MK = (1 << facy[0]) - 1;     for (register int i = 1; i <= n; i++) {       if (y % a[i] != 0) continue;       int masky = 0;       long long T = a[i];       for (register int k = 1; k <= facy[0]; k++) {         int p = 0;         while (T % facy[k] == 0) T /= facy[k], p++;         masky |= ((p < numy[k]) << (k - 1));       }       ans += minv[masky ^ MK];     }     cout << ans;     return 0;   }   