快速模幂运算

#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;
}

你可能感兴趣的:(快速幂运算,快速模幂运算)