传送门
素数分解,简单数论
但是要细心
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m1,m2;
int ans,t,num;
int maxu;
int prime[30001];
void div(){
memset(prime,0,sizeof(prime));
for(int i=2;i<=m1;i++){
while(m1%i==0){
prime[i]++;
m1/=i;
maxu=i;
}
prime[i]*=m2;
}
}
int main(){
scanf("%d%d%d",&n,&m1,&m2);
if(m1==1){
printf("0");
return 0;
}
div();
ans=2147483647;
for(int i=0;i<n;i++){
scanf("%d",&num);
t=-1;
for(int i=2;i<=maxu;i++){
if(prime[i]>0){
int cur=0;
while(num%i==0){
cur++;
num/=i;
}
if(cur==0){
t=-1;
break;
}
t=max(t,prime[i]%cur==0?prime[i]/cur:prime[i]/cur+1);
}
}
if(t!=-1){
ans=min(ans,t);
}
}
printf("%d",ans<2147483647?ans:-1);
return 0;
}