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 byp, 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
题目大意(百度):给定两个数, p ,a ; 如果p是素数,输出n;
否则判断 a^p%p是否等于a ,是输出yes; 否则输出no;
除了当时题意看不懂 这个题做起来没有任何困难。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long
#define inf 1000000007
using namespace std ;
ll quick(ll a , ll b , ll mod)
{
ll res = 1 ;
a = a % mod ;
while(b)
{
if(b%2) res = res * a % mod ;
b /= 2 ;
a = a * a % mod ;
}
return res ;
}
ll prime(ll a )
{
if(a==1||a==0) return false ;
for(int i = 2 ; i<=sqrt(a) ;i++)
{
if(a%i==0) return false ;
}
return true ;
}
int main()
{
ll p , a ;
while(cin>>p>>a , a + p)
{
ll judge ;
if(prime(p))
{
printf("no\n");
continue;
}
else
{
judge = quick(a, p,p);
if(judge==a)
{
printf("yes\n");
continue ;
}
else
{
printf("no\n");
continue;
}
}
}
return 0 ;
}