[POJ3641] 伪素数

来源:互联网 发布:易建联伦敦奥运会数据 编辑:程序博客网 时间:2024/06/16 20:09

题目描述

根据以a为基的伪素数的定义,判断p是否是以a为基的伪素数。(2 < p ≤ 1000000000 and 1 < a < p )


输入格式

输入数据有多组,每组数据占一行,包含两个整数p和a,输入以“0 0”结束。


输出格式

如果p是以a为基的伪素数,则输出“yes”,否则输出“no”。


样例数据

样例输入

3 2
10 3
341 2
341 3
1105 2
1105 3
0 0

样例输出

no
no
yes
no
yes
yes


题目分析

Miller_Rabin的前奏,这题没什么意义
a为底伪素数定义:p不是素数且a^p≡a (mod p)。


源代码

#include<algorithm>#include<iostream>#include<iomanip>#include<cstring>#include<cstdlib>#include<vector>#include<cstdio>#include<cmath>#include<queue>using namespace std;inline const long long Get_Int() {    long long num=0,bj=1;    char x=getchar();    while(x<'0'||x>'9') {        if(x=='-')bj=-1;        x=getchar();    }    while(x>='0'&&x<='9') {        num=num*10+x-'0';        x=getchar();    }    return num*bj;}bool Check_Prime(long long n) { //判断n是否是素数    if(n==0||n==1)return false;    for(long long i=2; i<=sqrt(n); i++)        if(n%i==0)return false;    return true;}long long Quick_Pow(long long a,long long b,long long mod) {    long long ans=1;    while(b>0) {        if(b&1)ans=ans*a%mod;        b>>=1;        a=a*a%mod;    }    return ans;}int main() {//伪素数:p不是素数且a^p≡a (mod p)。    while(true) {        long long p=Get_Int(),a=Get_Int();        if(p==0&&a==0)break;        if(Check_Prime(p))puts("no");        else {            if(Quick_Pow(a,p,p)==a)puts("yes");            else puts("no");        }    }    return 0;}

0 0