题目的意思抽象出来就是说
求:使(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;
}