快速模幂运算

来源:互联网 发布:java中类的构造方法 编辑:程序博客网 时间:2024/05/19 13:19
#include <cstdio>/**   挑战程序设计竞赛 p122*/__int64 mod_pow(__int64 x,__int64 n,__int64 mod){   //快速模幂运算    __int64 res = 1;    while(n > 0){        if(n & 1){  //如果二进制位最低位为1,则乘上x^(2^i)            res = (res * x) % mod;        }        x = (x * x) % mod;  //将x平方        n >>= 1;    //n右移一位,相当于n = [n / 2] 取下底    }    return res;}bool is_prime(__int64 n){   //素数判定    for(int i = 2; i * i <= n; ++i){        if(!(n % i))            return false;    }    return n > 1;  //排除负数,0,1的可能性}__int64 n;void solve(){    bool flag = true;    if(!is_prime(n)){        for(__int64 i = 1; i < n; ++i){            __int64 xn = mod_pow(i, n, n);            __int64 x = i % n;            if(xn != x){                flag = false;            }        }    } else {        flag = false;    }    if(flag){        printf("Yes\n");    } else {        printf("No\n");    }}int main(){    while(scanf("%d", &n) != EOF){        solve();    }    return 0;}

0 0
原创粉丝点击