您的位置:首页 > 其它

[NOIp2009普及组]细胞分裂

2017-08-14 13:49 369 查看

思路:

首先将$30000$以内的所有质数求出,再对$m1$质因数分解。
对于每个$s$,计算它和$m1$的每个公共质因数的倍数关系,取$max$则为该细胞满足条件所花费的最少时间。
再对于每个细胞的最小时间取$min$,即为所求的结果。
注意特判$m1=1$和$m2=0$的情况。

 

#include<cmath>
#include<cstdio>
#include<cctype>
#include<vector>
inline int getint() {
char ch;
while(!isdigit(ch=getchar()));
int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int inf=0x7fffffff;
std::vector<int> prime;
inline bool isPrime(const int x) {
for(unsigned i=0;i<prime.size();i++) {
if(prime[i]>sqrt(x)) break;
if(!(x%prime[i])) return false;
}
return true;
}
const int M1=30001;
int p[M1];
int main() {
int n=getint(),m1=getint(),m2=getint();
if(m1==1||!m2) {
puts("0");
return 0;
}
for(int i=2;i<M1;i++) {
if(isPrime(i)) {
prime.push_back(i);
}
}
for(unsigned i=0;m1!=1;i++) {
while(!(m1%prime[i])) {
p[i]+=m2;
m1/=prime[i];
}
}
int ans=inf;
while(n--) {
int s=getint(),tmp=0;
for(unsigned i=0;i<prime.size();i++) {
if(!p[i]) continue;
int cnt=0;
if(s%prime[i]) goto Next;
while(!(s%prime[i])) {
cnt++;
s/=prime[i];
}
tmp=std::max(tmp,(p[i]-1)/cnt);
}
ans=std::min(ans,tmp);
Next:;
}
printf("%d\n",ans==inf?-1:ans+1);
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: