九九归一

来源:互联网 发布:注册淘宝 编辑:程序博客网 时间:2024/06/07 09:04

九九归一


稍作尝试可得三类情况, 分类讨论:
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");}
0 0