Pseudoprime numbers POJ 3641(快速幂)

Posted vbel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pseudoprime numbers POJ 3641(快速幂)相关的知识,希望对你有一定的参考价值。

原题

题目链接

题目分析

依题意要先检测p是否为素数,这个可以用埃筛筛出1-sqrt(1e9)的素数,然后判定一下p是否能被这些数整除,不能的话就是素数,否则则为合数.至于a的p次方直接套个快速幂就行了.

代码

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <utility>
 6 #include <ctime>
 7 #include <cmath>
 8 #include <cstring>
 9 #include <string>
10 #include <stack>
11 #include <queue>
12 #include <vector>
13 #include <set>
14 #include <map>
15 
16 using namespace std;
17 typedef long long LL;
18 const int INF_INT=0x3f3f3f3f;
19 const LL INF_LL=0x3f3f3f3f3f3f3f3f;
20 
21 const int MAX=40000;
22 bool is_prime[MAX];
23 int prime[MAX];
24 int cnt;
25 
26 void pre()
27 
28     for(int i=2;i<MAX;i++) is_prime[i]=true;
29     for(int i=2;i<MAX;i++)
30     
31         if(is_prime[i])
32         
33             prime[cnt++]=i;
34             for(int j=(i<<1);j<MAX;j+=i) is_prime[j]=false;
35         
36     
37 
38 
39 LL q_power(LL a,LL b,LL mod)
40 
41     LL res=1;
42     a%=mod;
43     while(b)
44     
45         if(b&1) res=(res*a)%mod;
46         a=(a*a)%mod;
47         b>>=1;
48     
49     return res;
50 
51 
52 bool check(LL x)
53 
54     if(x<MAX) return is_prime[x];
55     for(int i=0;i<cnt;i++)
56         if(!(x%prime[i])) return false;
57     return true;
58 
59 
60 int main()
61 
62 //    freopen("black.in","r",stdin);
63 //    freopen("black.out","w",stdout);
64     pre();
65     LL a,p;
66     while(~scanf("%lld %lld",&p,&a)&&(a||p))
67     
68         if(q_power(a,p,p)==a&&!check(p)) printf("yes\n");
69         else printf("no\n");
70     
71     return 0;
72 

 

以上是关于Pseudoprime numbers POJ 3641(快速幂)的主要内容,如果未能解决你的问题,请参考以下文章

Pseudoprime numbers POJ 3641(快速幂)

poj Pseudoprime numbers 3641

POJ3641 Pseudoprime numbers(快速幂+素数判断)

Pseudoprime numbers POJ - 3641

POJ 3641 Pseudoprime numbers (快速幂)

POJ3641 Pseudoprime numbers (幂取模板子)