NC23046 华华教月月做数学 快速幂 __int128

链接:https://ac.nowcoder.com/acm/problem/23046
来源:牛客网

找到了心仪的小姐姐月月后,华华很高兴的和她聊着天。然而月月的作业很多,不能继续陪华华聊天了。华华为了尽快和月月继续聊天,就提出帮她做一部分作业。
月月的其中一项作业是:给定正整数A、B、P,求ABmod  PA^B\mod PABmodP的值。华华觉得这实在是毫无意义,所以决定写一个程序来做。但是华华并不会写程序,所以这个任务就交给你了。
因为月月的作业很多,所以有T组询问。
输入描述:

第一行一个正整数T表示测试数据组数。
接下来T行,每行三个正整数A、B、P,含义如上文。

输出描述:

输出T行,每行一个非负整数表示答案。

示例1
输入
复制

2
2 5 10
57284938291657 827493857294857 384729583748273

输出
复制

2
18924650048745

备注:

1≤T≤1031\le T\le10^31≤T≤103,1≤A,B,P≤10181\le A,B,P\le10^{18}1≤A,B,P≤1018



裸快速幂,求 A B   m o d P A^B~mod P AB modP的值, A , B , m o d < = 1 e 18 A,B,mod <= 1e18 A,B,mod<=1e18

//快速幂板子
ll mul(__int128 a, __int128 b, __int128 mod) {
	return (a * b) % mod;
}

ll fp(ll x, ll y, ll mod) {
	ll ret = 1;
	while(y) {
		if(y & 1) ret = mul(ret, x, mod);
		x = mul(x, x, mod);
		y >>= 1;
	}
	return ret;
}
#define debug
#ifdef debug
#include <time.h>
#include "/home/majiao/mb.h"
#endif

#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <math.h>

#define MAXN ((int)1e5+7)
#define ll unsigned long long int
#define INF (0x7f7f7f7f)
#define fori(lef, rig) for(int i=lef; i<=rig; i++)
#define forj(lef, rig) for(int j=lef; j<=rig; j++)
#define fork(lef, rig) for(int k=lef; k<=rig; k++)
#define QAQ (0)

using namespace std;

#ifdef debug
#define show(x...) \
do { \
	cout << "\033[31;1m " << #x << " -> "; \
	err(x); \
} while (0)

void err() { cout << "\033[39;0m" << endl; }
template<typename T, typename... A>
void err(T a, A... x) { cout << a << ' '; err(x...); }
#endif

#ifndef debug
namespace FIO {
	template <typename T>
	void read(T& x) {
		int f = 1; x = 0;
		char ch = getchar();

		while (ch < '0' || ch > '9') 
			{ if (ch == '-') f = -1; ch = getchar(); }
		while (ch >= '0' && ch <= '9') 
			{ x = x * 10 + ch - '0'; ch = getchar(); }
		x *= f;
	}
};
using namespace FIO;
#endif


int n, m, Q, K;

ll mul(__int128 a, __int128 b, __int128 mod) {
	return (a * b) % mod;
}

ll fp(ll x, ll y, ll mod) {
	ll ret = 1;
	while(y) {
		if(y & 1) ret = mul(ret, x, mod);
		x = mul(x, x, mod);
		y >>= 1;
	}
	return ret;
}
    
int main() {
#ifdef debug
	freopen("test", "r", stdin);
	clock_t stime = clock();
#endif
	scanf("%d ", &Q);
	while(Q--) {
		ll a, b, mod;
		scanf("%llu %llu %llu ", &a, &b, &mod);
		printf("%llu\n", fp(a, b, mod));
	}





#ifdef debug
	clock_t etime = clock();
	printf("rum time: %lf 秒\n",(double) (etime-stime)/CLOCKS_PER_SEC);
#endif 
	return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值