FZU:1759-Problem 1759 Super A^B mod C (欧拉降幂)

题目链接:http://acm.fzu.edu.cn/problem.php?pid=1759

欧拉降幂是用来干啥的?例如一个问题AB mod c,当B特别大的时候int或者longlong装不下的时候需要对B mod 一个数并且不改变最终的答案,这就可以将使用欧拉降幂公式来进行计算。

公式:AB mod C  == AB%φ(C) + φ(C) mod C (其实φ(c)是c的欧拉函数值),这样就是欧拉函数的使用。

 

#include <stdio.h>
#include <cstring>
#include <algorithm>

using namespace std;
typedef long long ll;
const int maxn = 1e6+100;

char b[maxn];
ll a, c;

ll eular(ll n) {
    ll res = n;
    for (ll i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            n /= i;
            res = res / i * (i - 1);

            while (n % i == 0) {
                n /= i;
            }
        }
    }
    if (n > 1)
        res = res / n * (n - 1);
    return res;
}

ll quickpow(ll a, ll m, ll c) {
    ll ans = 1;
    while (m) {
        if (m & 1)
            ans = ans * a % c;
        a = a * a % c;
        m >>= 1;
    }
    return ans;
}

int main() {
    while (scanf("%lld%s%lld", &a, b, &c) != EOF) {
        ll p = eular(c);
        int len = strlen(b);
        ll m = 0;
        for (int i = 0; i < len; i++) {
            m = m * 10;
            m += b[i] - '0';
            m %= p;
        }
        m += p;
        printf("%lld\n", quickpow(a, m, c));
    }
}

 

posted @ 2018-08-05 10:15  GoldenFingers  阅读(266)  评论(0编辑  收藏  举报