题意: 用a^p == a (mod p)两个数来判断 a^p是否是伪素数,若p是素数,输出"no" ,若a^p是伪素数,输出"yes",否则"no"
题解:当p是奇数时 有:( a^p)mod n = ((a % n) *(a ^ (p - 1)) % n) % n;
当p是偶数时:a ^ p = ( a ^ ( p / 2 ) * a^ ( p / 2));
于是这里用分治求解;
/*
* File: main.cpp
* Author: ssslpk
*
* Created on August 28, 2012, 8:57 PM
*/
#include <cstdlib>
#include<cstdio>
#include<math.h>
#include<iostream>
using namespace std;
#define int64 long long
int64 mod_mult(int64 a, int64 b, int64 n)//(a*b) mod n
{
int64 s = 0;
a = a % n;
while (b) {
if (b & 1)s = (s + a) % n;
a <<= 1;
a %= n;
b >>= 1;
}
return s;
}
int64 mod;
int64 p, a;
int64 mod_exp(int64 p)//(a^p) mod n
{
if (p == 1)return a % mod;
if (p & 1)return ((a % mod) * mod_exp(p - 1)) % mod;
int64 temp = mod_exp(p / 2);
return mod_mult(temp, temp, mod);
}
bool isprime(int64 p) {
int64 m = (int64) sqrt((double) p);
for (int i = 2; i <= m; i++) {
if (p % i == 0)return 0;
}
return 1;
}
int main(int argc, char** argv) {
while (scanf("%lld%lld", &p, &a), p || a) {
mod = p;
if (isprime(p)) {
printf("no\n");
continue;
}
if (mod_exp(p) == a)printf("yes\n");
else printf("no\n");
}
return 0;
}

1807

被折叠的 条评论
为什么被折叠?



