hdu1905||poj3641 Pseudoprime numbers

来源:互联网 发布:iphone ssh 默认端口 编辑:程序博客网 时间:2024/04/29 21:17

题意: 用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 longint64 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;}


原创粉丝点击