题目链接: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 ", quickpow(a, m, c)); } }