题解:P1069 [NOIP2009 普及组] 细胞分裂
DiaoHantong · · 题解
题目传送门
思路
这道题看似复杂,数据量太大,计算有难度,但是仔细分析会发现,其实只需对
要如何判断整除呢?逐个考虑每个
代码
#include<bits/stdc++.h>
using namespace std;
int m1,m2,s[10001],k=0x7fffffff;
int prime[30010],cnt[30010];
int decompose(int n){//分解质因子
int m=0;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0){
prime[++m]=i;
cnt[m]=0;
while(n%i==0){
n/=i;
cnt[m]++;
}
}
}
if(n>1){
prime[++m]=n;
cnt[m]=1;
}
//m的质因子需要在m1的基础上每项乘m2
for(int i=1;i<=m;i++)cnt[i]*=m2;
return m;
}
int main(){
int n;
cin>>n>>m1>>m2;
for(int i=1;i<=n;i++)cin>>s[i];
if(m1==1){cout<<"0";return 0;}
int mz=decompose(m1);
for(int i=1;i<=n;i++){
int ans=0;//记录选第i种细胞的时间
for(int j=1;j<=mz;j++){
//若不能整除,则无解
if(s[i]%prime[j]){ans=0x7fffffff;break;}
int c=0;
//求出质因子在s[i]中出现的次数c
while(!(s[i]%prime[j]))s[i]/=prime[j],c++;
//若不能整除,则多一秒
int tmp=cnt[j]%c==0?0:1;
ans=max(ans,cnt[j]/c+tmp);
}
//记录最小的秒数
k=min(k,ans);
}
cout<<(k==0x7fffffff?-1:k);
return 0;
}