Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <bits/stdc++.h>
- #define boAshraf { ios_base::sync_with_stdio(false); cin.tie(NULL); }
- #define ll long long
- #define sz(s) (int)(s).size()
- #define endl "\n"
- #define ordered_set tree<ll, null_type, less_equal<ll>, rb_tree_tag, tree_order_statistics_node_update>
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace __gnu_pbds;
- using namespace std;
- void File();
- void sol();
- const int mod=1e9+7;
- int add(int a,int b){
- return (0LL+a+b)%mod;
- }
- int mul(int a,int b){
- return (1LL*a*b)%mod;
- }
- int fp(int n, int p) {
- if (p == 0) return 1;
- if (p == 1) return n;
- int temp = fp(n, p >> 1);
- temp = mul(temp, temp);
- if (p & 1) temp = mul(temp, n);
- return temp;
- }
- const int N = 1e7 + 5;
- bool prime[N];
- vector<int>primes;
- void sieve_v2() {
- fill(prime, prime + N, true);
- prime[0] = prime[1] = false;
- for (int i = 4; i < N; i += 2) {
- prime[i] = false;
- }
- for (int i = 3; i * i < N; i += 2) {
- if (prime[i]) {
- for (int j = i * i; j < N; j += i + i) {
- prime[j] = false;
- }
- }
- }
- primes.push_back(2);
- for (int i = 3; i < N; i += 2) {
- if (prime[i]) primes.push_back(i);
- }
- }
- vector<pair<int, int>> fac(int x) {
- int st = 0;
- vector<pair<int, int>> ret;
- while (1LL * primes[st] * primes[st] <= x) {
- int cnt = 0;
- while (x % primes[st] == 0) x /= primes[st], cnt++;
- if (cnt) ret.push_back({primes[st], cnt});
- st++;
- }
- if (x > 1) ret.push_back({x, 1});
- return ret;
- }
- map<int,int>idx;
- vector<pair<int,int>>v;
- vector<vector<pair<int,int>>>pf;
- int dp[10000][(2<<10)+2];
- int vis[10000][(2<<10)+2];
- int idd;
- int check;
- int rec(int i,int mask){
- if(i==v.size())return mask==check;
- int &ret=dp[i][mask];
- if(vis[i][mask]==idd)return ret;
- vis[i][mask]=idd;
- ret=0;
- int new_mask=mask;
- for(auto it:pf[i]){
- if(it.second==pf.back()[idx[it.first]].second)new_mask|=(1<<idx[it.first]);
- }
- ret=add(ret,mul(rec(i+1,new_mask),fp(2,v[i].second)-1));
- ret=add(ret,rec(i+1,mask));
- return ret;
- }
- int main() {
- boAshraf
- File();
- int t = 1;
- cin >> t;
- sieve_v2();
- while (t--) {
- sol();
- }
- return 0;
- }
- void sol() {
- ++idd;
- int n,x;cin>>n>>x;
- map<int,int>freq;
- idx.clear();
- v.clear();
- pf.clear();
- int ans=0;
- int o=0;
- for (int i = 0; i < n; ++i) {
- int val;cin>>val;
- if(x%val==0) { if(val>1)freq[val]++;else o++; }
- }
- if(x==1) { ans = fp(2, o) - 1;cout<<ans<<endl;return; }
- else ans=fp(2,o);
- for(auto [f,s]:freq)v.push_back({f,s});
- if(v.empty()||v.back().first!=x)v.push_back({x,0});
- for(auto [f,s]:v)pf.push_back(fac(f));
- for (int i = 0; i < pf.back().size(); ++i) {
- idx[pf.back()[i].first]=i;
- }
- check=(1<<pf.back().size())-1;
- ans=mul(ans,rec(0,0));
- cout<<ans<<endl;
- }
- void File() {
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- }
Advertisement
Add Comment
Please, Sign In to add comment