poj 3641解题报告

 

Pseudoprime numbers
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 3611   Accepted: 1285

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-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是素数输出no,如果p不是素数,判断a^p%p==a是否成立,如果成立输出yes,否则输出no
代码:
语言:c++
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
	long long a,p;
	int isprime(long long n);
	long long modular(long long a,long long r,long long m);
	while(cin>>p>>a)
	{
		if(p==0&&a==0)
			break;
		long long result;
		if(isprime(p))
			cout<<"no"<<endl;
		else
		{
			if(a==modular(a,p,p))
				cout<<"yes"<<endl;
			else
				cout<<"no"<<endl;
		}
	}
	return 0;
}
int isprime(long long n)
{
	if(n==2)
		return 1;
	if(n<=1||n%2==0)
		return 0;
	long long j=3;
	while(j<=(long long)sqrt(double(n)))
	{
		if(n%j==0)
			return 0;
		j+=2;
	}
	return 1;
}
long long modular(long long a,long long r,long long m)
{
	long long d=1,t=a;
	while(r>0)
	{
		if(r%2==1)
			d=(d*t)%m;
		r/=2;
		t=t*t%m;
	}
	return d;
}
 

 

你可能感兴趣的:(c,input,语言,each,output,Numbers)