POJ 3641 快速幂+素数判断

来源:互联网 发布:淘宝客如何设置返利 编辑:程序博客网 时间:2024/05/20 18:48

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-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是素数,输出n;

否则判断 a^p%p是否等于a ,是输出yes; 否则输出no;

除了当时题意看不懂 这个题做起来没有任何困难。。。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#define ll long  long #define inf 1000000007using 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 ;}


0 0
原创粉丝点击