注意一下两点:
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;
} 
京公网安备 11010502036488号