牛客 华华教月月做数学 __int128+快速幂

https://ac.nowcoder.com/acm/contest/392/B

链接:https://ac.nowcoder.com/acm/contest/392/B
来源:牛客网
 

题目描述

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

输入描述:

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

输出描述:

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

示例1

输入

复制

2
2 5 10
57284938291657 827493857294857 384729583748273

输出

复制

2
18924650048745

备注:

1≤T≤1031≤T≤103,1≤A,B,P≤10181≤A,B,P≤1018

思路:首先欧拉降幂是不行的,A^B%P,然而P的范围是[1,10^18],依然会爆long long,那怎么办呢?用到了一种很神奇的东西,这玩意就是__int128,故名思议,就是有128位的整数,其表示的范围大概在10^36以内。(具体多少我没算)反正这道题是够用了,但是这玩意你的编译器可能不认识,评测机是认识的。(比如我的CB编译就通不过)但是不妨碍我们使用,这东西不能用cin和cout读入和输出,因此要我们自己实现一个读入和输入的方法。快速幂就不多说了。

#include
#include
#include
#include
#include
typedef long long ll;
using namespace std;

__int128 a,b,c;

inline __int128 read()//读入
{
	__int128 x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}

void print(__int128 x)//输出
{
    if(x > 9)
		print(x/10);//递归调用
    putchar(x%10+48);
}

void cal()//快速幂
{
	__int128 t1=a,t2=1;
	while(b>0)
	{
		if(b&1)
			t2=t2*t1%c;
		t1=t1*t1%c;
		b>>=1;
	}
	print(t2);
}

int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		a=read(),b=read(),c=read();
		cal();
		putchar('\n');
	}
	return 0;
}

 

你可能感兴趣的:(__int128,快速幂)