#include <bits/stdc++.h>   using namespace std;   vector<long long> primer;   long long mul(long long x, long long y, long long mod) {     long long s = 0;     for (; y; y /= 2, x = (x + x) % mod)       if (y & 1) s = (s + x) % mod;     return s;   }   long long gcd(long long x, long long y) { return y ? gcd(y, x % y) : x; }   long long power(long long x, long long y, long long mo) {     long long s = 1;     for (; y; y /= 2, x = mul(x, x, mo))       if (y & 1) s = mul(s, x, mo);     return s;   }   bool isPrime(long long x) {     if (x == 2) return 1;     for (int T = 10; T; T--) {       long long a = rand() % (x - 2) + 2;       if (power(a, x - 1, x) != 1) return 0;       int p = x - 1;       for (; p % 2 == 0;) {         p /= 2;         long long v = power(a, p, x);         if (mul(v, v, x) == 1 && v != 1 && v != x - 1) return 0;       }     }     return 1;   }   long long pollard(long long n, int c) {     long long i = 0, k = 2, x = rand() % (n - 1) + 1, y = x;     for (;;) {       x = (mul(x, x, n) + c) % n;       long long g = gcd((y - x + n) % n, n);       if (g != 1 && g != n) return g;       if (x == y) return n;       if ((++i) == k) y = x, k <<= 1;     }   }   void getPrimes(long long n, vector<long long> &p) {     if (n == 1) return;     if (isPrime(n)) {       p.push_back(n);       return;     }     long long d = n;     for (int i = 2; d == n; i++) d = pollard(n, i);     getPrimes(d, p);     getPrimes(n / d, p);   }   long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }   inline void moreprime() {     int start = primer.back() + 1;     if (primer.size() % 10000 == 0)       cout << primer.size() <<     << primer.back() << endl;     while (true) {       for (unsigned int i = 0; i < primer.size(); i++) {         if (start % primer[i] == 0) break;         if (primer[i] * primer[i] > start) {           primer.push_back(start);           return;         }       }       start++;     }   }   vector<long long> defactor(long long a) {     vector<long long> result;     getPrimes(a, result);     sort(result.begin(), result.end());     vector<long long> rs;     if (result.size() > 0) rs.push_back(result[0]);     for (int i = 1; i < result.size(); i++) {       if (result[i] != result[i - 1]) rs.push_back(result[i]);     }     return rs;   }   int getbit(long long a, const vector<long long> &factors) {     int bit = 0;     for (unsigned int i = 0; i < factors.size(); i++) {       if (a % factors[i] == 0) {         a /= factors[i];         bit |= 1 << i;       }     }     return bit;   }   int main() {     std::ios::sync_with_stdio(false);     std::cin.tie(0);     int n;     long long x, y;     primer.push_back(2);     cin >> n >> x >> y;     if (y % x != 0) {       printf( 0 );       return 0;     }     vector<long long> factors = defactor(y / x);     vector<long long> a(40000, 0), b(40000, 0);     int maxa = 0, maxb = 0;     int v;     long long num;     for (int i = 0; i < n; i++) {       cin >> num;       if (num % x == 0) {         v = getbit(num / x, factors);         a[v]++;         maxa = max(maxa, v);       }       if (y % num == 0) {         v = getbit(y / num * gcd(y / num, num) / gcd(y / num, x), factors);         b[v]++;         maxb = max(maxb, v);       }     }     long long count = 0;     for (int i = 0; i <= maxa; i++) {       if (a[i]) {         for (int j = 0; j <= maxb; j++) {           if (b[j]) {             if (!(i & j)) count += a[i] * b[j];           }         }       }     }     cout << count << endl;   }