[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; }
相关文章推荐
- NOIP2009普及组-细胞分裂
- NOIP2009普及组细胞分裂(数论)——yhx
- 洛谷 P1069 [NOIP2009普及组 T3] 细胞分裂
- [普及] NOIP 2009 细胞分裂
- NOIP2009普及组细胞分裂(数论)——yhx
- [NOIP2009普及] 细胞分裂
- 【NOIP】普及组2009 细胞分裂
- [NOIP2009] 普及组
- [NOIP2009][vijos1814]细胞分裂(数学相关)
- NOIP2009 普及组 道路游戏
- NOIP2009初赛普及组(C语言)参考答案
- NOIP2009普及组 分数线划定
- [普及] NOIP 2009 道路游戏
- 【用脚趾头解决NOIP】(2)NOIP2009~NOIP2015年普及组完善程序
- noip2009普及组道路游戏解题报告
- noip2009 普及组
- NOIP2009普及组——道路游戏(game)
- NOIP2009普及组 分数线划定
- noip 2009 细胞分裂
- NOIP2009 普及组 复赛 poly 多项式输出