A.九九归一

题目:http://ch.ezoj.tk/contest/CH%20Round%20%2355%20-%20Streaming%20%236%20(NOIP模拟赛day2)/九九归一

题解:题目意思就是问 a是不是n的一个原根

        首先如果 gcd(a,n)!=1 显然不可能 输出0

        然后我们有性质

        若 gcd(a,n)==1 则 a模n的阶k|phi(n)

        所以就可以枚举phi(n)的约数判定了

        复杂度题解中说是 q*logn*logn*logn的。。。

代码:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<iostream>
 7 #include<vector>
 8 #include<map>
 9 #include<set>
10 #include<queue>
11 #include<string>
12 #define inf 1000000000
13 #define maxn 100000
14 #define maxm 500+100
15 #define eps 1e-10
16 #define ll long long
17 #define pa pair<int,int>
18 #define for0(i,n) for(int i=0;i<=(n);i++)
19 #define for1(i,n) for(int i=1;i<=(n);i++)
20 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
21 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
22 using namespace std;
23 inline int read()
24 {
25     int x=0,f=1;char ch=getchar();
26     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
27     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
28     return x*f;
29 }
30 int n,tot,a[maxn];
31 int power(int xx,int yy)
32 {
33     ll t=1,x=xx,y=yy;
34     for(;y;y>>=1,x=(x*x)%n)
35      if(y&1)t=(t*x)%n;
36     return t;
37 }
38 inline bool check(int m)
39 {
40     for1(i,tot)if(power(m,a[i])==1)return 0;
41     return 1;
42 }
43 inline int gcd(int x,int y){return y?gcd(y,x%y):x;}
44 int main()
45 {
46     freopen("input.txt","r",stdin);
47     freopen("output.txt","w",stdout);
48     n=read();
49     int x=n,y=n;
50     for2(i,2,sqrt(n))
51      if(x%i==0)
52       {
53           y=(y/i)*(i-1);
54           while(x%i==0)x/=i;
55       }
56     if(x!=1)y=(y/x)*(x-1);
57     for1(i,y)if(y%i==0)a[++tot]=i;tot--;
58     int cs=read();
59     while(cs--)
60     {
61      int m=read();
62      if(gcd(m,n)!=1)printf("0");
63      else if(check(m))printf("1");
64      else printf("0");
65     }
66     printf("\n");
67     return 0;
68 }
View Code

相关文章: