POJ-3641 Pseudoprime numbers

来源:互联网 发布:天庭淘宝城红白txt下载 编辑:程序博客网 时间:2024/04/29 23:02
Pseudoprime numbers
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 8638 Accepted: 3627

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 210 3341 2341 31105 21105 30 0

Sample Output

nonoyesnoyesyes

Source

Waterloo Local Contest, 2007.9.23


#include<stdio.h>  #include<string.h>   bool sushu(long long n)  {      long long  i;      for(i=2;i*i<n;++i)      {          if(n%i==0)              return false;      }      return true;  }   long long quictpow(long long n,long long m)  {      long long ans=1,cnt=m;      while(cnt>0)      {          if(cnt&1)              ans=(ans*n)%m;            n=(n*n)%m; cnt=cnt/2;     }      return ans;  }   int main()  {      long long p,a;      while(scanf("%lld%lld",&p,&a)&&p||a)      {          if(sushu(p))              printf("no\n");          else if(a==quictpow(a,p))              printf("yes\n");          else if(a!=quictpow(a,p))              printf("no\n");      }      return 0;  }  


0 0