您的位置:首页 > 其它

POJ 3641

2014-03-10 20:55 302 查看
Pseudoprime numbers

Time Limit: 1000MSMemory Limit: 65536K
Total Submissions: 6044Accepted: 2421
Description

Fermat's theorem states that for any prime number p and for any integer a > 1, ap = a (mod p). That is, if we raise a to the pth power and divide by p, the remainder is a. Some (but not very many) non-prime values of p, known as base-a pseudoprimes, have this property for some a. (And some, known as Carmichael Numbers, are base-a pseudoprimes for all a.)

Given 2 < p ≤ 1000000000 and 1 < a < p, determine whether or not p is a base-a pseudoprime.

Input

Input contains several test cases followed by a line containing "0 0". Each test case consists of a line containing p and a.

Output

For each test case, output "yes" if p is a base-a pseudoprime; otherwise output "no".

Sample Input

3 2
10 3
341 2
341 3
1105 2
1105 3
0 0

Sample Output

no
no
yes
no
yes
yes

Source

Waterloo Local Contest, 2007.9.23

快速幂

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>

using namespace std;

typedef long long ll;

int p,a;

bool judge() {
for(int i = 2; i * i <= p; i++) {
if(p % i == 0) return false;
}

return true;
}
bool  mod_pow(ll x,ll n) {
ll res = 1;
while(n > 0) {
if(n & 1) res = res * x % p;
x = x * x % p;
n >>= 1;
}

return res == a;
}

int main() {
//freopen("sw.in","r",stdin);

while(~scanf("%d%d",&p,&a) && p && a) {
if(!judge() && mod_pow(a,p)) printf("yes\n");
else printf("no\n");

}

return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: