九九歸一

九九歸一


稍作嘗試可得三類情況, 分類討論:
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");
}
發佈了57 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章