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