AC代码
本质上是分解质因数和一层覆盖关系,调试了几个小时,问题出在数组越界,难受死我了,不过最后还是AC了。
#include<iostream>
using namespace std;
#define inf 0x3f3f3f3f
const int N=10010;
int n,m1,m2;
int s[N];
//底数的质因数分解
int base[200][2],cnt;
//培养皿的质因数分解
int tbase[100010][2],tcnt;
void mysplit(int num){
for(int i=2;i*i<=num;i++){
if(num%i==0){
base[cnt][0]=i;base[cnt][1]=1;
num/=i;
while(num%i==0){
base[cnt][1]+=1;
num/=i;
}
cnt++;
}
}
if(num!=1){
base[cnt][0]=num;
base[cnt++][1]=1;
}
}
void tmysplit(int num){
tcnt=0;
for(int i=2;i*i<=num;i++){
if(num%i==0){
tbase[tcnt][0]=i;tbase[tcnt][1]=1;
num/=i;
while(num%i==0){
tbase[tcnt][1]+=1;
num/=i;
}
tcnt++;
}
}
if(num!=1){
tbase[tcnt][0]=num;
tbase[tcnt++][1]=1;
}
}
int max(int a,int b){
return a>b?a:b;
}
int min(int a,int b){
return a<b?a:b;
}
bool judge(){
//首先找到第一个相等的位置
int t=0;
while(t<cnt && tbase[t][0]!=base[0][0])
t++;
if(cnt+t>tcnt)
return false;
for(int i=0;i<cnt;i++)
if(base[i][0]!=tbase[t+i][0])
return false;
return true;
}
int main(){
int ans=inf;
cin>>n;
cin>>m1>>m2;
for(int i=1;i<=n;i++)
scanf("%d",&s[i]);
mysplit(m1);
for(int i=1;i<=n;i++){
tmysplit(s[i]);
//如果分解后得到的质数相同则说明可以进行分配
if(cnt<=tcnt && judge()){
int need,minneed=0;
int t=0;
while(tbase[t][0]!=base[0][0])
t++;
for(int j=0;j<cnt;j++){
if(base[j][1]*m2<=tbase[j+t][1])
need=0;
else if(base[j][1]*m2%tbase[j+t][1]==0)
need=base[j][1]*m2/tbase[j+t][1];
else
need=base[j][1]*m2/tbase[j+t][1]+1;
minneed=max(minneed,need);
}
ans=min(ans,minneed);
}
}
if(ans==inf)
cout<<-1;
else
cout<<ans;
return 0;
}