zrq495
www.zrq495.com

题意:

给一个 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 }
posted on 2012-07-31 14:51  zrq495  阅读(148)  评论(0编辑  收藏  举报