Advertisement
Zeinab_Hamdy

Untitled

Jul 11th, 2024
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.79 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define nl "\n"
  4. #define fi first
  5. #define se second
  6. #define pb push_back
  7. #define ll long long
  8. #define RV return void
  9. #define sz(x) int(x.size())
  10. #define all(v) v.begin(), v.end()
  11. #define rall(v) v.rbegin(), v.rend()
  12. #define fixed(n) fixed << setprecision(n)
  13. #define cin(v) for(auto&x:v) cin >> x;
  14. #define cout(v) for(auto&x:v) cout << x << " ";
  15. void files(){
  16.     #ifndef ONLINE_JUDGE
  17.        freopen("input.txt", "r", stdin);
  18.        freopen("output.txt", "w", stdout);
  19.     #endif
  20. }
  21.  
  22.  
  23. const ll mod = (ll) (1e9+7);
  24.  
  25. const int N = 1e7 ;
  26. int spf[N+5];
  27. void mod_Sieve(){
  28.    iota(spf , spf +N+5 , 0);
  29.    spf[0]=spf[1]=-1;
  30.  
  31.    for(int i = 2 ; i * i <= N ; i++)
  32.         if(spf[i]==i)
  33.             for(int j = i * i ; j <= N ; j+=i)
  34.                 if(spf[j]==j)
  35.                     spf[j]=i;
  36. }
  37.  
  38.  
  39.  
  40. int n ,x , mxVal;
  41. vector < vector < int > > dp;
  42. vector < int > v;
  43.  
  44.  
  45. map < int , int > mp , order;
  46.  
  47.  
  48.  
  49. int rec(int idx , int mask){
  50.    
  51.     int & ret = dp[idx][mask];
  52.     if(~ret)
  53.         return ret;
  54.  
  55.     if(idx == n ) return ret= (mask == (1 << mxVal) - 1 );
  56.  
  57.    
  58.     ret =0;
  59.     int temp = v[idx];
  60.  
  61.     int newmask = mask , cnt=0 , prev =0;
  62.  
  63.     while(temp > 1){
  64.         if(spf[temp] != prev){
  65.             if(cnt == mp[prev] and prev !=0 )
  66.                 newmask |= (1 << order[prev]);
  67.            
  68.             prev = spf[temp] ;
  69.             cnt=1;
  70.         }
  71.         else
  72.             cnt++;
  73.  
  74.         temp/= spf[temp];
  75.     }
  76.  
  77.     if(cnt == mp[prev] and cnt > 0 and prev)
  78.         newmask |= (1 << order[prev]);
  79.    
  80.  
  81.    
  82.     temp = rec(idx+1 , newmask) ;
  83.     if(mask != newmask){
  84.         ret += rec(idx+1 , mask);
  85.         if(ret >= mod) ret-=mod;
  86.         ret += temp;
  87.         if(ret >= mod) ret-=mod;
  88.     }else{
  89.         ret += 2*temp;
  90.         if(ret >= mod) ret-=mod;
  91.     }
  92.  
  93.  
  94.     // cout << v[idx] << " " << mask << " " << ret << nl;
  95.    
  96.     return ret ;
  97. }
  98.  
  99. void solve(){
  100.  
  101.    
  102.  
  103.     cin >> n >> x ;
  104.     v.clear();
  105.     mp.clear();
  106.     order.clear();
  107.     for(int i =0 ; i < n ; i++){
  108.         int q ; cin >> q;
  109.         if(x % q ==0) v.pb(q);
  110.     }
  111.  
  112.  
  113.     int temp =x;
  114.     while(temp > 1){
  115.         mp[spf[temp]]++;
  116.         temp/=spf[temp];
  117.     }
  118.    
  119.     n = sz(v);
  120.     int j =0;
  121.     for(auto& [f,s] : mp) order[f] = j++;
  122.     mxVal = sz(mp);
  123.     dp.assign(n+1 , vector <int> (1 << mxVal , -1));
  124.  
  125.  
  126.     cout << rec(0 , 0) << nl;
  127.    
  128.    
  129. }      
  130.  
  131. int main(){
  132.     ios_base::sync_with_stdio(false);
  133.     cin.tie(nullptr);
  134.     cout.tie(nullptr);
  135.                            
  136.     //  files();
  137.    
  138.     mod_Sieve();
  139.  
  140.     int testCase=1;
  141.         cin >> testCase ;
  142.     for(int i=1 ; i <= testCase ; i++){
  143.         // cout << "Case "<< i <<": " << nl;
  144.         solve();
  145.     }
  146.  
  147.     return 0;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement