noip2009普及组 细胞分裂&&vijos1814
题目的意思抽象出来就是说
求:使(a[i]^t)%(m1^m2)==0的t的最小值
数据范围:a[i]<=2*1e9,m1<=3"*1e4,m2<=1e4
第一次写这种题
由于数据太大不能直接取余
用到质因数分解
上图:
然后就可以计算了
上代码:
#include<cstdio> #include<cstring> struct node { int x,t; }e[10010]; int a[10010]; int main() { int n,m1,m2; scanf("%d %d %d",&n,&m1,&m2); if(m1==1) { printf("0\n");return 0; } int cnt=0; for(int i=2;m1!=1;i++) if(m1%i==0) { e[++cnt].x=i; while(m1%i==0) { e[cnt].t++; m1/=i; } e[cnt].t*=m2; } int ans=-1,k; for(int i=1;i<=n;i++) { scanf("%d",&k); bool f=1;int max=0; for(int j=1;j<=cnt&&f;j++) if(k%e[j].x==0) { int t=0; while(k%e[j].x==0) { t++;k/=e[j].x; } if(e[j].t%t==0) t=e[j].t/t; else t=e[j].t/t+1; max=max>t?max:t; } else f=0; if(f&&(ans==-1||max<ans)) ans=max; } printf("%d\n",ans); return 0; }