题意:
给一个 p 和 一个 a,如果这个p 本身就是一个素数,就输出 no,如果不是素数,那么计算 ( a ^ p) % p 如果结果等于 a 那么输出 yes 否则输出 no。
快速幂取模就是在O(logn)内求出a^n mod b的值。算法的原理是(a*b) mod c=(a mod c)*(b mod c)mod c。
代码如下:
1 #include<iostream> 2 #include<cmath> 3 4 using namespace std; 5 6 int prime(long long n) 7 { 8 int i; 9 for (i=2; i<sqrt(n); i++) 10 { 11 if (n%i==0) return 0; 12 } 13 return 1; 14 } 15 16 long long mod(long long a, long long n, long long m) 17 { 18 long long int t; 19 if (n==0) return 1%m; 20 if (n==1) return a%m; 21 t=mod(a, n/2, m); 22 t=t*t%m; 23 if (n%2) t=t*a%m; 24 return t; 25 } 26 27 int main() 28 { 29 long long int a, p, i; 30 while(cin >> p >> a, p||a) 31 { 32 if (prime(p)) 33 { 34 cout << "no" << endl; 35 continue; 36 } 37 long long k=mod(a, p, p); 38 if (a == k) 39 cout << "yes" << endl; 40 else 41 cout << "no" << endl; 42 } 43 return 0; 44 }