UVa 10006 Carmichael Numbers (快速幂运算)

来源:互联网 发布:c语言复制字符串函数 编辑:程序博客网 时间:2024/06/09 19:32


快速幂运算---反复平方法


/*
*   [题意]
*   输入n,若满足如下两个条件,则n是Carmichael number
*       1、n不是素数
*       2、对于所有a(2<=a<n),有(a^n)%n = a
*
*   [解题方法]
*   快速幂取模,注意运算过程中的乘法溢出int

*/

#include <cstdio>using namespace std;typedef long long ll;bool is_prime(ll x){    for (int i = 2; i * i <= x; i++){        if (x % i == 0)            return 0;    }    return 1;}ll mod_pow(ll x, ll n, ll mod){    ll res = 1;    while (n > 0){        if (n & 1)            res = res * x % mod;    //如果二进制最低位为1,则乘上x^(2^i)        x = x * x % mod;   //将x平方        n >>= 1;    }    return res;}int main(){    ll n;    while (scanf("%lld", &n), n){        bool flag = 1;        if (is_prime(n))            flag = 0;        for (int i = 2; i < n && flag; i++){            if (mod_pow(i, n, n) != i)                flag = 0;        }        if (flag)            printf("The number %d is a Carmichael number.\n", n);        else            printf("%d is normal.\n", n);    }    return 0;}


#include <cstdio>using namespace std;typedef long long ll;bool is_prime(ll x){    for (int i = 2; i * i <= x; i++){        if (x % i == 0)            return 0;    }    return 1;}ll mod_pow(ll x, ll n, ll mod){    if (n == 0)        return 1;    ll res = mod_pow(x * x % mod, n / 2, mod);    if (n & 1)        res = res * x % mod;    return res;}int main(){    ll n;    while (scanf("%lld", &n), n){        bool flag = 1;        if (is_prime(n))            flag = 0;        for (int i = 2; i < n && flag; i++){            if (mod_pow(i, n, n) != i)                flag = 0;        }        if (flag)            printf("The number %d is a Carmichael number.\n", n);        else            printf("%d is normal.\n", n);    }    return 0;}



1 0
原创粉丝点击