1046 A^B Mod C
基准时间限制:1 秒 空间限制:131072 KB 分值:
给出3个正整数A B C,求A^B Mod C。
例如,3 5 8,3^5 Mod 8 = 3。
Input
3个正整数A B C,中间用空格分隔。(1 <= A,B,C <= 10^9)
Output
输出计算结果
Input示例
3 5 8
Output示例
3
A ^ B MOD C = A ^ (B % Phi(C) + Phi(C)) Mod C (B >= Phi(C))
Phi(C)为欧拉函数,指小于等于C的且与C互质的数的个数
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <cmath>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
#define esp 1e-8
const double PI = acos(-1.0);
const int inf = 1000000005;
const long long mod = 1000000007;
//freopen("in.txt","r",stdin); //输入重定向,输入数据将从in.txt文件中读取
//freopen("out.txt","w",stdout); //输出重定向,输出数据将保存在out.txt文件中
long long A, B, C;
long long eular(long long x)
{
long long res = x;
long long ans = x;
for (int i = 2; i * i <= x; ++ i)
{
if (res % i == 0)
ans = ans / i * (i - 1);
while (res % i == 0)
res /= i;
}
if (res > 1)
ans = ans / res * (res - 1);
return ans;
}
long long power(long long a, long long b)
{
long long res = 1;
while (b)
{
if (b & 1)
res = res * a % C;
b >>= 1;
a = a * a % C;
}
return res % C;
}
int main()
{
while (cin >> A >> B >> C)
{
long long x = (B % eular(C) + eular(C));
//cout << eular(C) << endl;
if (B >= eular(C))
cout << power(A, x) << endl;
else
cout << power(A, B) << endl;
}
}