Time Limit: 1000MS | | Memory Limit: 65536K |
Total Submissions: 8035 | | Accepted: 3341 |
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
<span style="font-size:18px;">3 2 10 3 341 2 341 3 1105 2 1105 3 0 0 </span>
Sample Output
<span style="font-size:18px;">no no yes no yes yes</span>
题意:p不是素数,且a^p对p取模等于a,输出yes,其他的输出no。
题解:判断p是否是素数那部分直接蛮力求就好。
#include<cstdio>
#include<cmath>
long long pow(long long a,long long p )
{
long long ans=1,base=a,cnt=p;
while(p>0)
{
if(p&1)
ans=(ans*base)%cnt;
base=(base*base)%cnt;
p>>=1;
}
return ans;
}
int prime(long long n)//判断n是否是素数;
{
for(long long i=2;i*i<=n;i++)
{
if(n%i==0)
return 0;
}
return 1;
}
int main()
{
long long p,a;
while(scanf("%lld%lld",&p,&a)&&(p||a))
{
//printf("%d %d\n",pow(a,p),prime(p));
if(pow(a,p)==a&&(!prime(p)))
printf("yes\n");
else
printf("no\n");
}
return 0;
}