题意:
输入p,a,两个数如果p是素数输出no,如果p不是素数,
根据以a为基的伪素数定义,判断p是否是以a为基的伪素数。
分析:
判断a^p%p==a是否成立,如果成立输出yes,否则输出no
只有当p是合数且a^p = a ( mod p ) 时,才输出yes。
直接应用素数测试定义进行判断。
**米勒罗宾素数测试 Miller_Rabin
算法原理及实现
LL random(LL n){...}LL multi()//a*b%mLL quick_mod()bool miller_rabin(LL n){for(L i=1;i<=n;i++){LL a=random(n-2)+1;if(quick_mod(a,n-1,n)!=1) return false;}return true;}
解题报告:16ms
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define LL long long
bool ifprime(LL n){
LL i;
int iffind=0;
if(n==2||n==1) return 1;
else{
for(i=2;i<=sqrt(n+0.0)+1;i++)
if(n%i==0){
iffind=1;
break;
}
if(iffind) return 0;
else return 1;
}
}
LL quick_mod(LL a,LL b,LL m)
{
LL ans=1;
while(b){
if(b&1){
ans=(ans*a)%m;
b--;
}
b/=2;
a=a*a%m;
}
return ans;
}
int main(){
LL n,a,b,p;
while(~scanf("%lld%lld",&p,&a)&&(p+a)){
if(ifprime(p))
puts("no");
else{
LL ans=1;
ans=quick_mod(a,p,p);
if(ans==a)
puts("yes");
else
puts("no");
}
}
return 0;
}