标签:using main ret cti stream 直接 ring tac vector
依题意要先检测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(快速幂)
标签:using main ret cti stream 直接 ring tac vector
原文地址:https://www.cnblogs.com/VBEL/p/11444655.html