注意一下两点:
1、一般,质因数分解
for 1~根号n if 可以整除就保存 while n%i==0 n/=i 因数次数++ if n!=1 保存n————大于根号n的因数大数的话先打质数表
然后用质数表的质数筛
打表 for i:循环质数表 if n%i==0 保存因数 while n%i==0 n/=i 因数次数++2、题目是细菌从1开始每次*一个数,假如试管是2^7,细菌速度2^2,要7<=2+2+2+2,即ceil(7/2)
代码:
#include <bits/stdc++.h> using namespace std; const int NN=30000,INF=0x3f3f3f3f,N=NN+10; int prime[N],cnt,cntp,s[N],piepPr[N],piepPw[N],piepC,pwSum,cntm,power,mnum; int n,m1,m2; bool st[N]; void mPrime(){ cnt=0; for(int i=2;i<=NN;i++){ if(!st[i]) prime[cnt++]=i; for(int j=0;prime[j]<=NN/i;j++){ st[i*prime[j]]=true; if(i%prime[j]==0) break; } } cntp=cnt; } int main(int argc, char** argv) { cin>>n; cin>>m1>>m2; for(int i=0;i<n;i++){ cin>>s[i]; } mPrime(); cnt=0; for(int i=0;m1!=1&&i<cntp;i++){//试管数质因数分解 if(m1%prime[i]==0){ while(m1%prime[i]==0){ piepPr[cnt]=prime[i]; piepPw[cnt]+=m2; m1/=prime[i]; } cnt++; } // 原: while(m1%prime[i]==0){ // piepPr[cnt]=prime[i]; piepPw[cnt]+=m2; m1/=prime[i]; // } // cnt++; //没有if:这样就会有piepPr[]=0而且还会有错误 } piepC=cnt; cntm=INF; for(int j=0;j<n;j++){//循环细菌 pwSum=0;//最大的时间 for(int i=0;i<=piepC;i++){//循环试管 if(i==piepC){ if(cntm>pwSum) cntm=pwSum; break; }else{ if(s[j]%piepPr[i]!=0){ break; } power=0; while(s[j]%piepPr[i]==0){ power++; s[j]/=piepPr[i]; } if(piepPw[i]%power==0) pwSum=max(piepPw[i]/power,pwSum); else pwSum=max(pwSum,piepPw[i]/power+1); } } } if(cntm==INF) puts("-1"); else cout<<cntm<<endl; return 0; }