JZOJ.5325【NOIP2017模拟8.21】九九归一
好霸气的题目名
对于φ(n)我们可以线性求出来,然后先判断qφ(n)在mod n的意义下是否等于1,是的话再对φ(n)进行因数分解,看看它的因子a是否满足qa在mod 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 }