1046 A^B Mod C

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;
	}
}


你可能感兴趣的:(1046 A^B Mod C)