#include<bits/stdc++.h> #define ll long long #define pll pair<ll ,ll> #define pub push_back using namespace std ; void get_prime_factors(vector<pll> &prime_factors, ll x) { for(ll i = 2 ; i*i <= x ; i++) { if(x%i == 0) { ll cnt = 0 ; while(x%i == 0) { cnt++ ; x /= i ; } prime_factors.pub({i, cnt}) ; } } if(x != 1) prime_factors.pub({x , 1}) ; return ; } void process(vector<vector<ll> > &to_process, vector<pll>& prime_factors, ll &ans) { ll k = prime_factors.size() ; map<vector<ll> , ll> cnt ; vector<ll> curr(k) ; cnt[curr]++ ; for(int i = 0 ; i < to_process.size() ; i++) { for(int j = 0 ; j < k ; j++) { curr[j] += to_process[i][j] ; curr[j] -= prime_factors[j].second ; } cnt[curr]++ ; } for(auto itr = cnt.begin() ; itr != cnt.end() ; itr++) { ll curr_cnt = (*itr).second ; ll curr_ans = ((curr_cnt)*(curr_cnt-1))/2 ; ans += curr_ans ; } return ; } void solve() { ll n, x ; cin >> n >> x ; vector<pll> prime_factors ; get_prime_factors(prime_factors, x) ; ll arr[n] ; vector<vector<ll> > to_process ; ll ans = 0 ; for(int i = 0 ; i < n ; i++) { cin >> arr[i] ; vector<ll> factors ; for(int j = 0 ; j < prime_factors.size() ; j++) { ll p = prime_factors[j].first ; ll cnt = 0 ; while(arr[i]%p == 0) { cnt++ ; arr[i] /= p ; } factors.pub(cnt) ; } if(arr[i] != 1) { process(to_process, prime_factors, ans) ; to_process.clear() ; } else { to_process.pub(factors) ; } } process(to_process, prime_factors, ans) ; to_process.clear() ; cout << ans << endl ; return ; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #ifndef ONLINE_JUDGE freopen("inputf.txt" , "r" , stdin) ; freopen("outputf.txt" , "w" , stdout) ; freopen("error.txt" , "w" , stderr) ; #endif int t ; cin >> t ; while(t--) { solve() ; } return 0; }