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 }
神奇的代码

 

转载于:https://www.cnblogs.com/Lanly/p/7405071.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值