POJ 3641 快速幂

题意:给你两个数:p和a,如果p是素数输出no,如果p不是素数,判断a^p%p==a是否成立,如果成立输出yes,否则输出no。

注意:
1.因为a和p不互质,不能用费马小定理。。。
2. 用long long

// By SiriusRen 
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
long long p,a;
bool prime(){
    int t=sqrt(p)+1;
    for(int i=2;i<=t;i++)
        if(!(p%i))return 0;
    return 1;
}
long long Pow(long long x,long long y){
    long long ans=1,res=x;
    while(y){
        if(y&1)ans=(ans*res)%p;
        res=(res*res)%p;
        y>>=1;
    }
    return ans;
}
int main(){
    while(scanf("%lld%lld",&p,&a)&&(p||a)){
        if(prime()){puts("no");continue;}
        if(Pow(a,p)==a)puts("yes");
        else puts("no");
    }
}

这里写图片描述

posted @ 2016-07-30 16:16  SiriusRen  阅读(99)  评论(0编辑  收藏  举报