AhmedAshraff

Untitled

Jul 15th, 2024
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.14 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <bits/stdc++.h>
  3. #define boAshraf { ios_base::sync_with_stdio(false); cin.tie(NULL); }
  4. #define ll long long
  5. #define sz(s) (int)(s).size()
  6. #define endl "\n"
  7. #define ordered_set tree<ll, null_type, less_equal<ll>, rb_tree_tag, tree_order_statistics_node_update>
  8. #include <ext/pb_ds/assoc_container.hpp>
  9. #include <ext/pb_ds/tree_policy.hpp>
  10. using namespace __gnu_pbds;
  11. using namespace std;
  12. void File();
  13. void sol();
  14. const int mod=1e9+7;
  15. int add(int a,int b){
  16.     return (0LL+a+b)%mod;
  17. }
  18. int mul(int a,int b){
  19.     return (1LL*a*b)%mod;
  20. }
  21. int fp(int n, int p) {
  22.     if (p == 0) return 1;
  23.     if (p == 1) return n;
  24.     int temp = fp(n, p >> 1);
  25.     temp = mul(temp, temp);
  26.     if (p & 1) temp = mul(temp, n);
  27.     return temp;
  28. }
  29. const int N = 1e7 + 5;
  30. bool prime[N];
  31. vector<int>primes;
  32. void sieve_v2() {
  33.     fill(prime, prime + N, true);
  34.     prime[0] = prime[1] = false;
  35.     for (int i = 4; i < N; i += 2) {
  36.         prime[i] = false;
  37.     }
  38.     for (int i = 3; i * i < N; i += 2) {
  39.         if (prime[i]) {
  40.             for (int j = i * i; j < N; j += i + i) {
  41.                 prime[j] = false;
  42.             }
  43.         }
  44.     }
  45.     primes.push_back(2);
  46.     for (int i = 3; i < N; i += 2) {
  47.         if (prime[i]) primes.push_back(i);
  48.     }
  49. }
  50. vector<pair<int, int>> fac(int x) {
  51.     int st = 0;
  52.     vector<pair<int, int>> ret;
  53.     while (1LL * primes[st] * primes[st] <= x) {
  54.         int cnt = 0;
  55.         while (x % primes[st] == 0) x /= primes[st], cnt++;
  56.         if (cnt) ret.push_back({primes[st], cnt});
  57.         st++;
  58.     }
  59.     if (x > 1) ret.push_back({x, 1});
  60.     return ret;
  61. }
  62. map<int,int>idx;
  63. vector<pair<int,int>>v;
  64. vector<vector<pair<int,int>>>pf;
  65. int dp[10000][(2<<10)+2];
  66. int vis[10000][(2<<10)+2];
  67. int idd;
  68. int check;
  69. int rec(int i,int mask){
  70.     if(i==v.size())return mask==check;
  71.     int &ret=dp[i][mask];
  72.     if(vis[i][mask]==idd)return ret;
  73.     vis[i][mask]=idd;
  74.     ret=0;
  75.     int new_mask=mask;
  76.     for(auto it:pf[i]){
  77.         if(it.second==pf.back()[idx[it.first]].second)new_mask|=(1<<idx[it.first]);
  78.     }
  79.     ret=add(ret,mul(rec(i+1,new_mask),fp(2,v[i].second)-1));
  80.     ret=add(ret,rec(i+1,mask));
  81.     return ret;
  82. }
  83. int main() {
  84.     boAshraf
  85.     File();
  86.     int t = 1;
  87.     cin >> t;
  88.     sieve_v2();
  89.     while (t--) {
  90.         sol();
  91.     }
  92.     return 0;
  93. }
  94. void sol() {
  95.     ++idd;
  96.     int n,x;cin>>n>>x;
  97.     map<int,int>freq;
  98.     idx.clear();
  99.     v.clear();
  100.     pf.clear();
  101.     int ans=0;
  102.     int o=0;
  103.     for (int i = 0; i < n; ++i) {
  104.         int val;cin>>val;
  105.         if(x%val==0) { if(val>1)freq[val]++;else o++; }
  106.     }
  107.     if(x==1) { ans = fp(2, o) - 1;cout<<ans<<endl;return; }
  108.     else ans=fp(2,o);
  109.     for(auto [f,s]:freq)v.push_back({f,s});
  110.     if(v.empty()||v.back().first!=x)v.push_back({x,0});
  111.     for(auto [f,s]:v)pf.push_back(fac(f));
  112.     for (int i = 0; i < pf.back().size(); ++i) {
  113.         idx[pf.back()[i].first]=i;
  114.     }
  115.     check=(1<<pf.back().size())-1;
  116.     ans=mul(ans,rec(0,0));
  117.     cout<<ans<<endl;
  118. }
  119.  
  120. void File() {
  121. #ifndef ONLINE_JUDGE
  122.     freopen("input.txt", "r", stdin);
  123.     freopen("output.txt", "w", stdout);
  124. #endif
  125. }
Advertisement
Add Comment
Please, Sign In to add comment