#include <bits/stdc++.h>
#define N 50005
#define int long long
#define inf 0x3f3f3f3f
using namespace std;
int s[N],n,m1,m2,ans,a[N],b[N],f[N],tmp,c[N],Max;
inline int gcd(int a,int b){
return !b?a:gcd(b,a%b);
}
inline void init(){
memset(f,0,sizeof(f));
for(int i=2;i<=sqrt(N);i++){
if(f[i]==1) continue;
for(int j=i+i;j<=N;j+=i) f[j]=1;
}
tmp=0;
for(int i=2;i<=N;i++)
if(!f[i]) c[++tmp]=i;
Max=tmp;
}
inline void divide(int x,int op){
tmp=1;
if(op==1) memset(a,0,sizeof(a));
else memset(b,0,sizeof(b));
while(x>1&&tmp<=Max){
while(x%c[tmp]==0){
x/=c[tmp];
if(op==1) a[tmp]++;
else b[tmp]++;
}
tmp++;
}
}
signed main(){
ios::sync_with_stdio(false); cin.tie(0);
init();
while(cin>>n>>m1>>m2){
for(int i=1;i<=n;i++) cin>>s[i];
ans=inf;
for(int i=1;i<=n;i++){
if(gcd(m1,s[i])==1) continue;
divide(s[i],1); divide(m1,2); tmp=-1;
for(int j=1;j<=Max;j++) b[j]*=m2;
for(int j=1;j<=Max;j++){
if(a[j]>=b[j]) continue;
if(a[j]==0){
tmp=-1; break;
}
if(b[j]%a[j]==0) tmp=max(tmp,b[j]/a[j]);
else tmp=max(tmp,b[j]/a[j]+1);
}
ans=tmp==-1?ans:min(ans,tmp);
}
else if(ans==inf) cout<<-1<<endl;
else cout<<ans<<endl;
}
return 0;
}
第一个点错了。
思路是质因数分解。