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(快速幂)
POJ3641 Pseudoprime numbers(快速幂+素数判断)
Pseudoprime numbers POJ - 3641