牛客网 牛客小白月赛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

题目描述

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

输入描述:

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

输出描述:

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

输入

复制
2
2 5 10
57284938291657 827493857294857 384729583748273

输出

复制
2
18924650048745

备注:

1T1031≤T≤103,1A,B,P1018

水一波博客。

题意很好理解,

因为数据范围比较大,超了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 }

。。。

猜你喜欢

转载自www.cnblogs.com/ZERO-/p/10679564.html