RT,评测记录, 代码:
#include<bits/stdc++.h>
using namespace std;
#define MAXN 10005
#define MAXS 50005
//数据范围
struct pos
{
int val;
int pr[MAXS];
int big=0;
}m1,m2,s[MAXS],m;
int n,p[MAXN],ans=2147483647;
bool prime[MAXN],flag=false;
void primes(int x) //线性筛质数
{
int cnt=0;
//目前找到的质数个数
prime[1]=false;
for(int i=2;i<=x;i++)
{
if(prime[i])
{
p[++cnt]=i;
//记录质数
for(int j=1;j<=cnt;j++)
{
if(i*p[j]<MAXN-10)
{
prime[i*p[j]]=false;
}
else
{
break;
}
}
}
else
{
int last,j=0;
do
{
if(i*p[++j]<MAXN-10)
{
prime[i*p[j]]=false;
last=p[j];
}
else
{
break;
}
}while(i%last && j<=cnt);
}
}
}
void factor(pos x) //分解质因数
{
int s=x.val,cnt=0;
while(s>=p[++cnt])
{
if(!(s%p[cnt]))
{
s/=p[cnt];
x.pr[p[cnt]]++;
x.big=cnt;
}
}
}
int main()
{
memset(prime,true,sizeof(prime));
primes(50000);
cin>>n>>m1.val>>m2.val;
factor(m1);
factor(m2);
for(int i=1;i<=max(m1.big,m2.big);i++)
{
m.pr[i]=m1.pr[i]+m2.pr[i];
}
m.big=max(m1.big,m2.big);
for(int i=1;i<=n;i++)
{
cin>>s[i].val;
factor(s[i]);
}
for(int i=1;i<=n;i++)
{
if(s[i].big<m.big)
{
continue;
}
flag=true;
int t=0;
for(int j=1;j<=s[i].big;j++)
{
if(s[i].pr[j]==0 && m.pr[j]>0)
{
flag=false;
break;
}
if(t<ceil(m.pr[j] / s[i].pr[j]))
{
t=ceil(m.pr[j] / s[i].pr[j]);
}
}
if(!flag)
{
continue;
}
ans=min(ans,t);
}
if(flag)
{
cout<<ans;
}
else
{
cout<<"-1";
}
return 0;
}