JZOJ.5325【NOIP2017模拟8.21】九九归一

Description

 

Input

Output

 

Sample Input

7 3
5 2 0

Sample Output

100
 

Data Constraint

好霸气的题目名

对于φ(n)我们可以线性求出来,然后先判断qφ(n)mod n的意义下是否等于1,是的话再对φ(n)进行因数分解,看看它的因子a是否满足qamod n的意义下是否等于1,若都不等于1则这个数字就是神奇的。

一般而言这个φ(n)的因数并不多。

 1 #include <cstring>
 2 #include <cstdio>
 3 #include <iostream>
 4 #include <cmath>
 5 #include <cstdlib>
 6 #define N 10000005
 7 using namespace std;
 8 long long p;
 9 long long n,q,fai,a,yin[N],top;
10 bool qwq;
11 long long read(){
12     long long x=0,w=1;
13     char c=0;
14     for (c=getchar();c<'0'||c>'9';c=getchar()) {if (c=='-') w=-1;}
15     for (;c>='0'&&c<='9';c=getchar()) x=(x<<3)+(x<<1)+c-'0';
16     return x*w;
17 }
18 long long getfai(){
19     long long qwq=n,a=n;
20     for (long long i=2;i*i<=a;++i)
21         if (a%i==0){
22             qwq=qwq/i*(i-1);
23             while (a%i==0) a/=i;
24         }
25     if (a>1) return qwq/a*(a-1);
26     return qwq;
27 }
28 long long kuai(long long a,long long b){
29     long long qwq=1;
30     long long qaq=a;
31     while (b){
32         if (b&1) qwq=qwq*qaq%n;
33         qaq=qaq*qaq%n;
34         b>>=1;
35     }
36     return qwq;
37 }
38 void getyin(){
39     top=0;
40     long long a=fai;
41     for (long long i=2;i*i<=a;++i)
42         if (a%i==0){
43             yin[++top]=i;
44             yin[++top]=a/i;
45         }
46 }
47 int main(){
48     n=read();
49     p=read();
50     fai=getfai();
51     getyin();
52     while (p--){
53         q=read();
54         if ((q==0)||(kuai(q,fai)%n!=1)) {putchar('0');continue;}
55         qwq=true;
56         for (long long i=1;i<=top;++i)
57          if (kuai(q,yin[i])%n==1) {qwq=false; break;}    
58         if (qwq) putchar('1');
59         else putchar('0');
60     }
61     return 0;
62 }
神奇的代码

 

posted @ 2017-08-21 16:23  ~Lanly~  阅读(240)  评论(0编辑  收藏  举报