P1069 細胞分裂
阿新 • • 發佈:2020-11-04
很簡單的一個東西
除了我吧%寫成了/之後
思路:如果如此,那麼\(m1^{m2}\)中的每一個質因數一定比s中在最後一天的時候的指數大
就用這個做
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #define int long long using namespace std; int n; int mz,my; int s[54000]; int su[54001]; int p; int vis[54001]; int prime[54001]; int pr[54001]; int num[54001]; int pp; int x; void div(){ for(int i=2;i<=45000;++i){ if(!vis[i]){ prime[++p]=i; for(int j=i+i;j<=45000;j+=i){ vis[j]=1; } } } for(int i=1;i<=p;++i){ vis[i]=0; while(mz%prime[i]==0){ if(vis[i]==0){ vis[i]=1; pr[++pp]=prime[i]; } num[pp]++; mz/=prime[i]; } } } int ans; int Ai; int res; bool deal(int now){ int numm; res=-1; for(int i=1;i<=pp;++i){ if(now<pr[i]) return 0; numm=0; if(now%pr[i]==0){ while(now%pr[i]==0){ numm++; now/=pr[i]; } if(numm>=num[i]){ res=max((long long)1,res); } if(num[i]*my%numm==0) res=max(res,num[i]*my/numm); else res=max(res,num[i]*my/numm+1); }else{ return 0; } } return 1; } signed main(){ scanf("%lld",&n); scanf("%lld%lld",&mz,&my); ans=20000000000000; if(mz==1){ cout<<0<<endl; return 0; } div(); for(int i=1;i<=n;++i){ scanf("%lld",&x); if(deal(x)){ ans=min(ans,res); } } if(ans==20000000000000){ cout<<-1; }else{ cout<<ans<<endl; } return 0; }