uva10006

作者: 科学旅行者 | 来源:发表于2016-07-13 08:23 被阅读74次

    大致题意:

    给定一个数n,n是合数且对于任意的1 < a < n都有a的n次方模n等于a,这个数就是Carmichael Number.

    思路:

    可以先判定n是否为合数,是就接着判断。
    由于a的n次方的值可能很大,因此次题可以采用快速幂取余(poj1995),由于数值范围可能很大,因此可采用long long 类型。

    参考代码:

    #include <iostream>
    using namespace std;
    typedef long long ll;
    int flag_prime(ll num) {
        int flag = 1;
        if (num == 1) {
            return 0;
        }
        for (ll k = 2;k * k <= num;++k) {
            if (num % k == 0) {
                flag = 0;
                break;
            }
        }
        return flag;
    }
    ll quickmod(ll a,ll n) {
        ll res = 1;
        ll b = n;
        a = a % n;
        while (b > 0) {
            if (b & 1) {
                res = res * a % n;
            }
            b >>= 1;
            a = a * a % n;
        }
        return res;
    }
    int main() {
        ll a,n;
        ll res;
        int flag2;
        while (cin >> n && n) {
            int flag = flag_prime(n);
            if (flag) {
                cout << n << " is normal." << endl;
            }
            else {
                flag2 = 1;
                for (a = 2;a <= n-1;++a) {
                    res = quickmod(a,n);
                    if (res != a) {
                        cout << n << " is normal." << endl;
                        flag2 = 0;
                        break;
                    }
                }
                if (flag2 == 1) {
                    cout << "The number " << a << 
                            " is a Carmichael number." << endl;
                }
            }
        }
        return 0;
    }
    
    

    此题我没考虑到1既不是素数又不是合数,幸好此题n的范围为2~65000.

    相关文章

      网友评论

          本文标题:uva10006

          本文链接:https://www.haomeiwen.com/subject/ixpsjttx.html