代码里面 3e4+10 改成 3e5+10 就过了,要不然 Runtime Error. Received signal 8: Floating-point exception.
#include<bits/stdc++.h>
using namespace std;
const int N = 3e4+10 ;
const long long INF = 1e18 ;
int m1,m2,n;
int primes[N],tot;
bool vis[N];
struct E{
int p,q;
}have[N],aim[N];
int hcnt,acnt;
int st[N];
void init(){
for(int i=2;i<=N-10;i++){
if(!vis[i]){
primes[++tot]=i;
}
for(int j=1;primes[j]*i<=N-10;j++){
vis[i*primes[j]]=1;
if(i%primes[j]==0){
break;
}
}
}
}
void make(E r[],int &cnt,int a1,int a2){
for(int i=1;primes[i]<=a1/primes[i] and i<=tot;i++){
int p=primes[i];
if(a1%p==0){
int sum=0;
while(a1%p==0){
sum++;
a1/=p;
}
r[++cnt]={p,sum*a2};
}
}
if(a1!=1){
r[++cnt]={a1,a2};
}
}
int main(){
// freopen("P1069_2.in","r",stdin);
cin>>n;
cin>>m1>>m2;
if(m1==1){
cout<<0;
return 0;
}
init();
make(aim,acnt,m1,m2);
long long ans=INF;
while(n--){
int t;
cin>>t;
hcnt=0;
make(have,hcnt,t,1);
memset(st,0,sizeof st);
for(int i=1;i<=hcnt;i++){
if(have[i].p>N-10){
break;
}
st[have[i].p]=have[i].q;
}
int res=1,flag=1;
for(int i=1;i<=acnt;i++){
int q=aim[i].q;
int psq=st[aim[i].p];
if(!psq){
flag=0;
break;
}
res=max(res,q/psq+((q%psq)!=0));
}
if(flag){
ans=min(ans,res*1LL);
}
}
cout<<(ans==INF?-1:ans);
return 0;
}