Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int N = 100100 , M = 12;
- int n , X , Y , a[N];
- int cX[M] , cY[M];
- int cntMX[N][M] , cntMN[N][M];
- void solve(){
- scanf("%d %d %d",&n,&X,&Y);
- for(int i=0;i<n;i++)scanf("%d",a+i);
- // check if impossible
- if( Y%X || (n == 1 && X!=Y) ){
- printf("-1\n");
- return;
- }
- int ans=0;
- for(int i=0;i<n;i++)
- if( a[i]%X || Y%a[i] )
- ans++;
- if( ans > 1 ){
- printf("%d\n",ans);
- return;
- }
- ll gcd=a[0],lcm=a[0];
- for(int i=1;i<n;i++)
- gcd=__gcd(gcd,1ll*a[i]),
- lcm=lcm / __gcd(lcm,1ll*a[i]) *a[i];
- if( gcd == X && lcm == Y ){
- printf("0\n");
- return;
- }
- int tmp=Y;
- vector<int>primes;
- for(int i=2;i*i<=tmp;i++)
- if( tmp%i==0 ){
- primes.push_back(i);
- while( tmp%i==0 )tmp/=i;
- }
- if( tmp!=1 )primes.push_back(tmp);
- int m = primes.size();
- for(int j=0;j<m;j++){
- cX[j]=cY[j]=0;
- while( X%primes[j]==0 )X/=primes[j],cX[j]++;
- while( Y%primes[j]==0 )Y/=primes[j],cY[j]++;
- for(int i=0;i<n;i++){
- cntMX[i][j]=cntMN[i][j]=0;
- int c=0;
- while( a[i]%primes[j]==0 )a[i]/=primes[j],c++;
- cntMX[i][j]=( c == cY[j] );
- cntMN[i][j]=( c == cX[j] );
- if( i )
- cntMX[i][j]+=cntMX[i-1][j],
- cntMN[i][j]+=cntMN[i-1][j];
- }
- }
- for(int i=0;i<n;i++){ // change only element A[i]
- bool ok=1;
- for(int j=0;j<m;j++){
- int preMN = (( i>0 )?cntMN[i-1][j]:0);
- int preMX = (( i>0 )?cntMX[i-1][j]:0);
- int sufMN = cntMN[n-1][j]-cntMN[i][j];
- int sufMX = cntMX[n-1][j]-cntMX[i][j];
- if( cX[j]!=cY[j] )
- if( preMN+preMX+sufMN+sufMX ==0 ){
- ok=0;
- break;
- }
- }
- if(!ok)continue;
- printf("1\n");
- return;
- }
- printf("2\n");
- return;
- }
- int main(){
- int t;
- scanf("%d",&t);
- while( t-- )solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement