稍作嘗試可得三類情況, 分類討論:
1. 根本就沒有循環/循環節大於phi(n), 當且僅當a, n不互質
2. 循環節等於phi(n)
3. 循環節爲phi(n)的因數
2, 3類情況需要通過運算來判別.
通過快速冪來加速運算(又是二進制拆分思想…)
代碼不是我的.
#include<cstdio>
#include<cstring>
using namespace std;
const int N=100100;
int p[N],c[N],ans,n,m,k,x,tot,flag;
long long pow(long long x,int len)
{
if (len==1) return x;
long long t=pow(x,len/2);
if (len%2)
return t*t%k*(long long)x%k; else
return t*t%k;
}
int main()
{
scanf("%d%d",&n,&m);
k=n;ans=n;
for (int i=2;i*i<=n;i++)
if (n%i==0)
{
while (n%i==0) n/=i;
ans=ans/i*(i-1);
}
if (n!=1) ans=ans/n*(n-1);
for (int i=2;i*i<=ans;i++)
if (ans%i==0)
{
p[++tot]=i;
if (ans/i!=i)
p[++tot]=ans/i;
}
while (m--)
{
scanf("%d",&x);
flag=1;
for (int i=1;i<=tot;i++)
if (pow(x,p[i])==1)
{
flag=0;
break;
}
if (flag && pow(x,ans)==1)
printf("1"); else
printf("0");
}
printf("\n");
}