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 }

猜你喜欢

转载自www.cnblogs.com/VBEL/p/11444655.html
今日推荐