#include <bits/stdc++.h>   using namespace std;   const int maxn = 66, maxm = 200006, maxs = 65536,             pr[] = {2, 3, 5, 7, 11, 13, 17, 19};   int n, P, a[maxm], b[maxm], f[maxs], s1[maxn], s2[maxn];   long long X, Y, ans, p[maxn];   long long mul(long long x, long long y, long long MOD) {     x %= MOD;     y %= MOD;     return ((x * y - (long long)((long double)x / MOD * y) * MOD) % MOD + MOD) %            MOD;   }   long long power(long long x, long long y, long long MOD) {     long long w = x, sum = 1;     while (y) {       if (y & 1) sum = mul(sum, w, MOD);       w = mul(w, w, MOD);       y >>= 1;     }     return sum;   }   bool MR(long long N) {     for (int i = 0; i < 8; i++)       if (!(N % pr[i])) return N == pr[i];     for (int t = 0; t < 8; t++) {       int k = 0;       long long x, s;       for (x = N - 1; !(x & 1); x >>= 1, k++)         ;       x = power(rand() % (N - 3) + 2, x, N);       if (x == 1) continue;       for (; k; k--, x = s) {         s = mul(x, x, N);         if (s == 1) {           if (x < N - 1) return 0;           break;         }       }       if (s != 1) return 0;     }     return 1;   }   long long AMOD(long long& x, long long tem, long long MOD) {     if ((x += tem) >= MOD) x -= MOD;   }   long long gcd(long long x, long long y) { return !y ? x : gcd(y, x % y); }   long long _abs(long long x) { return x > 0 ? x : -x; }   long long findD(long long N) {     long long x = rand() % (N - 1) + 1, y = x, r = rand() % (N - 1) + 1;     for (int i = 1, k = 1;; i++) {       AMOD(x = mul(x, x, N), r, N - 1);       x++;       if (x == y) return -1;       long long t = gcd(_abs(x - y), N);       if (t > 1) return t;       if (i == k) k <<= 1, y = x;     }   }   void PR(long long N) {     if (N == 1) return;     if (MR(N)) {       p[++P] = N;       return;     }     long long D;     for (D = findD(N); D < 0; D = findD(N))       ;     PR(D);     PR(N / D);   }   int main() {     scanf( %d%lld%lld , &n, &X, &Y);     if (Y % X) return printf( 0 ), 0;     PR(Y);     sort(p + 1, p + 1 + P);     P = unique(p + 1, p + 1 + P) - p - 1;     long long tem = X;     for (int i = 1; i <= P; i++)       if (!(tem % p[i]))         while (!(tem % p[i])) s1[i]++, tem /= p[i];     tem = Y;     for (int i = 1; i <= P; i++)       if (!(tem % p[i]))         while (!(tem % p[i])) s2[i]++, tem /= p[i];     for (int i = 1; i <= n; i++) {       long long x;       scanf( %lld , &x);       if (!(x % X)) {         long long t = x;         for (int j = 1; j <= P; j++)           if (s1[j] < s2[j]) {             int num = 0;             while (!(t % p[j])) num++, t /= p[j];             a[i] |= (num > s1[j]) << j - 1;           }       } else         a[i] = -1;       if (!(Y % x)) {         long long t = x;         for (int j = 1; j <= P; j++)           if (s1[j] < s2[j]) {             int num = 0;             while (!(t % p[j])) num++, t /= p[j];             b[i] |= (num < s2[j]) << j - 1;           }       } else         b[i] = -1;     }     for (int i = 1; i <= n; i++)       if (~b[i]) f[(~b[i]) & ((1 << P) - 1)]++;     for (int j = 0; j < P; j++)       for (int i = 0; i < 1 << P; i++)         if (!((i >> j) & 1)) f[i] += f[i | (1 << j)];     for (int i = 1; i <= n; i++)       if (~a[i]) ans += f[a[i]];     return printf( %lld , ans), 0;   }