九九归一

九九归一


稍作尝试可得三类情况, 分类讨论:
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");
}
posted @ 2016-11-14 16:31  Zeonfai  阅读(224)  评论(0编辑  收藏  举报