题目链接
题目描述
题目大意:
有n种不同数量的细胞,每一个细胞每一秒都会分裂出一个新的,现在要把某一种细胞平均分到m1^m2^个容器里面,问选一种细胞,使得等待的时间最短,如果无法均分到容器中,就输出-1
做法
要均分就表示Si^t^%m1^m2^==0求t的最小值,看一下数据范围发现m1比较小,而Si很大,分别对Si和m1分解质因子,只要m1中的每一个质因子Si中都有,那么Si就可以通过分裂均分到m1^m2^中,因此不需要把Si的所有质因子都找到,只需要找到小于等于m1的所有质因子即可,因此时间复杂度就是n*3e3就是3e7,对于m1和Si共有的质因子需要满足pi*t>=pm1*m2,要让满足条件的t最小就是取所有共有质因子的最大比值,然后所有比值中取最小
CODE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include <bits/stdc++.h> #define debug freopen("in.txt","r",stdin); freopen("out.txt","w",stdout) #define ios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0) using namespace std; typedef long long ll; typedef unsigned long long ull; const int MAXN=1e6+100; const double pi=acos(-1); const int MOD=1e9+7; const int INF=0x3f3f3f3f; const int SUB=-0x3f3f3f3f; const int eps=1e-4; int tail,pr[MAXN/10]; bool np[MAXN]; void ol(){ np[1]=1; for(int i=2;i<=1000000;i++){ if(!np[i]) pr[++tail]=i; for(int j=1;j<=tail && pr[j]<=1000000/i;j++){ np[i*pr[j]]=1; if(i%pr[j]==0) break; } } } int n,m1,m2; int S[MAXN],z1[MAXN],z2[MAXN]; int main(){ ios; ol(); cin>>n>>m1>>m2; for(int i=1;i<=n;i++) cin>>S[i]; if(m1==1){ cout<<0<<'\n'; return 0; } for(int i=1;i<=tail && pr[i]<=m1/pr[i];i++){ while(m1%pr[i]==0){ z1[pr[i]]+=m2; m1/=pr[i]; } } if(m1>1) z1[m1]+=m2; int ans=INF; for(int i=1;i<=n;i++){ memset(z2,0,sizeof z2); int bk=S[i]; for(int j=1;j<=tail && pr[j]<=S[i]/pr[j];j++){ while(S[i]%pr[j]==0){ z2[pr[j]]++; S[i]/=pr[j]; } } if(S[i]>1 && S[i]<=30000) z2[S[i]]++; int flag=0,mx=-1; for(int j=1;j<=tail;j++){ if(z1[pr[j]] && !z2[pr[j]]){ flag=1; break; } else if(z1[pr[j]] && z2[pr[j]]) mx=max(mx,(z1[pr[j]]-1)/z2[pr[j]]+1); } if(!flag) ans=min(ans,mx); } if(ans!=INF) cout<<ans<<'\n'; else cout<<-1<<'\n'; return 0; }
|