noip 2009 细胞分裂

/*数论题 考察唯一分解定理 当然用到一些技巧*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 30010
using namespace std;
int n,m1,m2,prime[maxn],num,mi[maxn],S,s[maxn],ans=0x7fffffff,cnt;
bool f[maxn];
void Get_prime(int x)
{
for(int i=;i<=x;i++)
{
if(f[i]==)prime[++num]=i;
for(int j=;j<=num;j++)
{
if(i*prime[j]>x)break;
f[i*prime[j]]=;
if(i%prime[j]==)break;
}
}
}
void Get_mi(int x,int y)
{
if(x<)return;//m1==1 的时候会re
for(int i=;prime[i]<=x;i++)
{
while(x%prime[i]==)mi[i]++,x/=prime[i];
if(x==)break;
}
for(int i=;i<=m2;i++)
mi[i]*=y;
}
int cla(int a,int b)
{
if(a<b)return ;
int t=a/b;
if(t*b==a)return t;
else return t+;
}
int main()
{
scanf("%d%d%d",&n,&m1,&m2);
Get_prime(m1);
Get_mi(m1,m2);
for(int k=;k<=n;k++)
{
scanf("%d",&S);int falg=,A=;
for(int i=;prime[i]<=m1;i++)//相当于只分解m1 那这m1的因子来分解Si
{
cnt=;if(!prime[i])break;
while(S%prime[i]==)cnt++,S/=prime[i];
if(mi[i]&&!cnt)
{
falg=;break;
}
if(mi[i]==&&cnt==)continue;
A=max(A,cla(mi[i],cnt));
}
if(falg==)ans=min(ans,A);
}
if(ans>=0x7fffff)printf("-1\n");
else printf("%d\n",ans);
return ;
}
上一篇:manjaro配置


下一篇:mac下配置环境变量-mongo