示例2过不了,只能拿50分
#include<iostream>
using namespace std;
using ll= long long;
int N,S,m1,m2,midres=-1,result=INT32_MAX,cnt=0,mpower,spower,mtemp;
//midres用来求每个S的最后结果,result求midres的最小结果,mpower,spower用来存储m和s的每个质因数的幂
//mtemp:每次输入S后,mtemp就等于m1用来自除
int prime[6001],win[50001];
int workm(int p); //返回数字mtemp的质数p的幂,并对mtemp除去质因数p
int works(int p); //同理处理S
int main(){
cin>>N>>m1>>m2;
//补个特殊情况
if(m1==1){cout<<0;return 0;}
prime[0]=prime[1]=1;
//遍历50000以内的素数
for(int i=2;i*i<=50000;i++)
if(!prime[i]){
prime[++cnt]=i;
for(int j=i<<1;j<=50000;j+=i)
prime[j]=1;}
while(N--){
midres=-1;
mtemp=m1;
//补个特殊情况
cin>>S;if(S==1) continue;
for(int i=1;i<=cnt;i++){
mpower=workm(prime[i]);
spower=works(prime[i]);
//特殊情况处理,m有s没有的质数
if(mpower!=0&&spower==0){midres=-1;break;}
//s的质因数幂为0就直接跳过
if(spower==0) continue;
midres=max(midres,(mpower*m2-1)/spower+1);
//mtemp等于1的时候就不用处理了
if(mtemp==1) break;
}
//特殊情况处理,最后mtemp是个质数,并且这个质数无法被S消去,那就是t=-1
if(mtemp!=1&&S%mtemp!=0) midres=-1;
//擂台求最小result,注意对-1的处理
if(midres==-1&&result!=INT32_MAX) continue;
if(midres<result) result=midres;
}
cout<<result;
return 0;
}
int workm(int p){
int cnt1=0;
for(;mtemp%p==0;mtemp/=p)
cnt1++;
return cnt1;
}
int works(int p){
int cnt1=0;
for(;S%p==0;S/=p)
cnt1++;
return cnt1;
}