我们看这道题要我们求能不能把这几种几何式增长的细菌均分给n^m个试管,同时时间最短. 那么这道题我们肯定是要分解质因数的,因为细菌的增长不会使得构成它的质数增加.比如6可以拆成2^1*3^1. 我们看出它每次会乘自己,因此乘一次后会变成2^2*3^2,三次会变成2^3*3^3,以此类推.那么试管数也是同理.如果细菌底数的质数无法完全包含试管底数的质数,那么我们注定无法解决.
如果完全包含呢?我们先统计出两个底数共同的质数.我们统计出这些质数在所有试管中出现多少次.我们这时进行一个除法再取一个最大值即可.详情看代码.我们对每个细菌都这么进行操作就可以得到结果.
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int n,a,b,p[N],m[N],x,mi=(1e12),cnt,ma,sl;
bool f;
signed main(){
cin>>n>>a>>b;
if(a==1){
cout<<0;
return 0;
}
for(int i=2;i<=sqrt(a);i++){
if(a%i==0){
p[++cnt]=i, m[cnt]=1, a/=i;
while(a%i==0) m[cnt]++,a/=i;
}
}
if(a>1) p[++cnt]=a, m[cnt]++;
for(int i=1;i<=cnt;i++) m[i]*=b;
for(int i=1;i<=n;i++){
scanf("%lld",&x), f=1, ma=0;
for(int j=1;j<=cnt;j++){
sl=0;
while(x%p[j]==0) sl++, x/=p[j];
if(sl==0){f=0;break;}
if(m[j]%sl==0) ma=max(ma,m[j]/sl);
else ma=max(ma,m[j]/sl+1);
}if(f) mi=min(mi,ma);
}
if(mi==(1e12)) cout<<-1;
else cout<<mi;
return 0;
}

894

被折叠的 条评论
为什么被折叠?



