您的位置:首页 > 运维架构

HDU 1905 Pseudoprime numbers (快速幂求余)

2016-02-28 20:27 423 查看

Description

Fermat’s theorem states that for any prime number p and for any integer a > 1, a^p == 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 ≤ 1,000,000,000 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

快速幂求余,原理我没看懂,只能当模板用了~

#include <iostream>
using namespace std;

bool isprime(long long a) {
for(long long i = 2; i * i <= a; i++) {
if (a % i == 0) return false;
}
return true;
}

long long qmod(long long a, long long r, long long m) {
long long res = 1;
while (r) {
if (r & 1)
res = res * a % m;
a = a * a % m;
r >>= 1;
}
return res;
}

int main() {
long long p, a;
while (scanf("%I64d%I64d", &p, &a) && p && a) {
if (!isprime(p) && qmod(a, p, p) == a)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qmod