牛客网 牛客小白月赛12 B.华华教月月做数学-A^B mod P-快速幂+快速乘
链接:https://ac.nowcoder.com/acm/contest/392/B
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
找到了心仪的小姐姐月月后,华华很高兴的和她聊着天。然而月月的作业很多,不能继续陪华华聊天了。华华为了尽快和月月继续聊天,就提出帮她做一部分作业。
月月的其中一项作业是:给定正整数A、B、P,求ABmodPABmodP的值。华华觉得这实在是毫无意义,所以决定写一个程序来做。但是华华并不会写程序,所以这个任务就交给你了。
因为月月的作业很多,所以有T组询问。
月月的其中一项作业是:给定正整数A、B、P,求ABmodPABmodP的值。华华觉得这实在是毫无意义,所以决定写一个程序来做。但是华华并不会写程序,所以这个任务就交给你了。
因为月月的作业很多,所以有T组询问。
输入描述:
第一行一个正整数T表示测试数据组数。
接下来T行,每行三个正整数A、B、P,含义如上文。
输出描述:
输出T行,每行一个非负整数表示答案。
备注:
1≤T≤1031≤T≤103,1≤A,B,P≤1018
水一波博客。
题意很好理解,
因为数据范围比较大,超了ll,所以用快速幂+快速乘。
就是在快速幂的基础上,将快速幂中的乘法拆成加法求余,类似快速幂的快速乘。
代码:
1 //B 2 #include<bits/stdc++.h> 3 using namespace std; 4 typedef long long ll; 5 const int maxn=1e5+10; 6 7 ll mul(ll a,ll b,ll p) 8 { 9 ll ans=0; 10 while(b) 11 { 12 if(b&1) ans=(ans+a)%p; 13 a=(a+a)%p; 14 b=b>>1; 15 } 16 return ans; 17 } 18 19 ll Pow(ll a,ll b,ll p) 20 { 21 ll result=1; 22 ll base=a%p; 23 while(b){ 24 if(b&1) result=mul(result,base,p)%p; 25 base=mul(base,base,p)%p; 26 b=b>>1; 27 } 28 return result; 29 } 30 31 int main() 32 { 33 int t; 34 cin>>t; 35 while(t--){ 36 ll a,b,mod; 37 cin>>a>>b>>mod; 38 cout<<Pow(a,b,mod)<<endl; 39 } 40 }
。。。