[求条] 马蜂良好,有注释.自认为是对的

P1069 [NOIP2009 普及组] 细胞分裂

bug有点多,修了几个30pts 1WA 其余RE ```cpp #include <bits/stdc++.h> using namespace std; const int N=10024; const int MM=30034; int n,m1,m2; int ps=0; int s[N],prime[MM]; int f1[MM],f2[MM]; bitset<MM> vis; int main(){ cin>>n>>m1>>m2; for(int i=1;i<=n;++i) cin>>s[i]; // Step 1 : 埃筛 for(int i=2;i*i<=MM;++i) if(!vis[i]) for(int j=i*i;j<=MM;j+=i) vis[j]=1; for(int i=2;i<=MM;++i) if(!vis[i]) prime[++ps]=i; // Step 2 : 分解质因数m1^(m2) for(int i=1;i<=ps&&prime[i]*prime[i]<=m1;++i) while(m1%prime[i]==0) f1[prime[i]]+=m2,m1/=prime[i]; if(m1!=1) f1[m1]+=m2; // Step 3 : 枚举Si int ans=1<<30; for(int i=1;i<=n;++i){ memset(f2,0,sizeof(f2)); bool ok=1; int tans=0; // Step 4 : 分解Si for(int it=1;it<=ps&&prime[it]*prime[it]<=s[i];++it) while(s[i]%prime[it]==0) f2[prime[it]]++,s[i]/=prime[it]; if(s[i]!=1) f2[s[i]]++; // Step 5 : 处理指数 for(int j=1;j<=ps;++j) { int o1=f1[prime[j]]; int o2=f2[prime[j]]; if(o1!=0&&o2==0) ok=0; if(o1!=0&&o2!=0) { if(o1%o2==0) tans=max(tans,o1/o2); else tans=max(tans,o1/o2+1); } } if(ok) ans=min(ans,tans); } cout<<((ans==1<<30)?-1:ans); } ```
by da_ke @ 2024-03-23 21:02:14


|