Advertisement
Guest User

Untitled

a guest
May 26th, 2018
1,075
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.93 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 100100 , M = 12;
  5. int n , X , Y , a[N];
  6. int cX[M] , cY[M];
  7. int cntMX[N][M] , cntMN[N][M];
  8.  
  9. void solve(){
  10.  
  11. scanf("%d %d %d",&n,&X,&Y);
  12. for(int i=0;i<n;i++)scanf("%d",a+i);
  13.  
  14. // check if impossible
  15. if( Y%X || (n == 1 && X!=Y) ){
  16.     printf("-1\n");
  17.     return;
  18. }
  19.  
  20. int ans=0;
  21. for(int i=0;i<n;i++)
  22.     if( a[i]%X || Y%a[i] )
  23.         ans++;
  24.  
  25. if( ans > 1 ){
  26.     printf("%d\n",ans);
  27.     return;
  28. }
  29.  
  30. ll gcd=a[0],lcm=a[0];
  31. for(int i=1;i<n;i++)
  32.     gcd=__gcd(gcd,1ll*a[i]),
  33.     lcm=lcm / __gcd(lcm,1ll*a[i]) *a[i];
  34.  
  35. if( gcd == X && lcm == Y ){
  36.     printf("0\n");
  37.     return;
  38. }
  39.  
  40. int tmp=Y;
  41. vector<int>primes;
  42. for(int i=2;i*i<=tmp;i++)
  43.     if( tmp%i==0 ){
  44.         primes.push_back(i);
  45.         while( tmp%i==0 )tmp/=i;
  46.     }
  47. if( tmp!=1 )primes.push_back(tmp);
  48.  
  49.  
  50. int m = primes.size();
  51. for(int j=0;j<m;j++){
  52.  
  53.     cX[j]=cY[j]=0;
  54.     while( X%primes[j]==0 )X/=primes[j],cX[j]++;
  55.     while( Y%primes[j]==0 )Y/=primes[j],cY[j]++;
  56.  
  57.     for(int i=0;i<n;i++){
  58.  
  59.         cntMX[i][j]=cntMN[i][j]=0;
  60.         int c=0;
  61.         while( a[i]%primes[j]==0 )a[i]/=primes[j],c++;
  62.         cntMX[i][j]=( c == cY[j] );
  63.         cntMN[i][j]=( c == cX[j] );
  64.  
  65.         if( i )
  66.             cntMX[i][j]+=cntMX[i-1][j],
  67.             cntMN[i][j]+=cntMN[i-1][j];
  68.     }
  69. }
  70.  
  71.  
  72. for(int i=0;i<n;i++){ // change only element A[i]
  73.  
  74.       bool ok=1;
  75.       for(int j=0;j<m;j++){
  76.  
  77.         int preMN = (( i>0 )?cntMN[i-1][j]:0);
  78.         int preMX = (( i>0 )?cntMX[i-1][j]:0);
  79.  
  80.         int sufMN = cntMN[n-1][j]-cntMN[i][j];
  81.         int sufMX = cntMX[n-1][j]-cntMX[i][j];
  82.  
  83.         if( cX[j]!=cY[j] )
  84.         if( preMN+preMX+sufMN+sufMX ==0 ){
  85.             ok=0;
  86.             break;
  87.         }
  88.       }
  89.       if(!ok)continue;
  90.       printf("1\n");
  91.       return;
  92. }
  93. printf("2\n");
  94. return;
  95. }
  96.  
  97. int main(){
  98.  
  99. int t;
  100. scanf("%d",&t);
  101. while( t-- )solve();
  102.  
  103. return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement