poj 3641 Pseudoprime numbers

来源:互联网 发布:php continue 编辑:程序博客网 时间:2024/04/29 21:41
Pseudoprime numbers
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 8673 Accepted: 3640

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
题意:给出两个数p,a 如果p不是合数输出no 否则判断a的p次方对p取模之后是不是等于a
#include<stdio.h>__int64 a,p;__int64 quickpow(__int64 x,__int64 y,__int64 m){__int64 ans = 1;while(y){if(y&1){ans=(x * ans) % m;}x = (x * x ) % m;y >>= 1;}return ans;}bool prime(__int64 n){     if((n > 2 && n % 2 == 0) || (n == 1))          return false;      bool flag=true;      for(int i = 3;i * i <= n;i += 2)      {          if(n % i == 0)          {              flag = false;              break;         }      }      return flag;  }int main(){while(~scanf("%I64d%I64d",&p,&a)){if( p == 0 && a == 0)   break;      if(!prime(p)){if( quickpow(a,p,p) == a )   printf("yes\n");else   printf("no\n"); }    else     printf("no\n");}return 0;}


0 0