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

POJ:3641 Pseudoprime numbers(快速幂)

2016-07-23 12:17 441 查看
Pseudoprime numbers

Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 8579 Accepted: 3604
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

题目大意:给你一个p,一个a,问是否满足ap = a (mod p),即a^p%p是否等于a,如果p不是素数但是满足这个条件,那么它是伪素数,输出yes。
解题思路:先判断p是否为素数,是的话直接输出no,如果不是素数的话,再判断它是否满足上面的式子,满足的话输出yes,不满足的话输出no。(这里不用筛素法,数组太大,直接判断p是不是素数)
代码如下:
#include <stdio.h>
#include <math.h>
__int64 quickpow(__int64 a,__int64 ci)
{
__int64 ans=1;
__int64 base=a;
__int64 mod=ci;
while(ci)
{
if(ci&1)
{
ans=(ans*base)%mod;
}
ci>>=1;
base=(base*base)%mod;
}
return ans;
}
int judge(__int64 p)
{
__int64 size=sqrt(p)+1;
for(__int64 i=2;i<=size;i++)
{
if(p%i==0)
return 0;
}
return 1;
}
int main()
{
__int64 p,aa;
while(scanf("%I64d%I64d",&p,&aa)!=EOF)
{
if(p==0&&aa==0)
break;
if(judge(p)==1)
{
printf("no\n");
continue;
}
__int64 ans=quickpow(aa,p);
if(ans==aa)
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
return 0;
}

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