注意一下两点:
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;
}