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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值