poj3641

来源:互联网 发布:美国黑人矛盾 知乎 编辑:程序博客网 时间:2024/06/06 09:16

题目大意是这样的,输入p,a,两个数如果p是素数输出no,如果p不是素数,判断a^p%p==a是否成立,如果成立输出yes,否则输出no
很简单的事情,就是这么回事。

#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>using namespace std;const long long MaxN = 1000000;int prime[MaxN] = {0}, num_prime = 0;int isNotPrime[MaxN] = {1 ,1};void isprime(){    for(int i = 2 ; i < MaxN ; i++){        if(!isNotPrime[i]) prime[num_prime++] = i;        for(int j = 0 ; j < num_prime && i*prime[j] < MaxN ; j++){            isNotPrime[i * prime[j]] = 1;            if(!(i % prime[j])) break;        }    }}int judge(int p){    int flag = 1;    for(int i = 0 ; prime[i] < sqrt(p) ; i++)        if(p % prime[i] == 0) flag = 0;    if(flag) return 0;    else return 1;}long long judgemi(long long p , long long a){    long long res = 1 , n = p , m = a;    while(n){        if(n & 1) res = ( res * a ) % p;        a = (a * a) % p;        n >>= 1;    }    if(res % p == m) return 1;    else return 0;}int main(){    isprime();    //for(int i = 0 ; i < 50 ; i++) printf("%d-%d",i,prime[i]);    int p ,a;    while(~scanf("%d%d", &p, &a)){        if(a == 0 && p == 0) break;        if(judge(p)){         //   printf("&&&\n");            if(judgemi(p,a)) printf("yes\n");            else printf("no\n");        }        else printf("no\n");    }    return 0;}
0 0