是一种简单而有效的算法,可以在O(log n)的时间复杂度计算乘方。
例如求3的10次方
实例1(acwing89. a^b)
求 a的 b次方对 p 取模的值。
输入格式
三个整数 a,b,p ,在同一行用空格隔开。
输出格式
输出一个整数,表示a^b mod p
的值。
数据范围
0≤a,b≤1090
1≤p≤1091
输入样例:
3 2 7
输出样例:
2
代码实现
#include<iostream>
using namespace std;
int main(){
long long a,b,p;
cin>>a>>b>>p;
long long ans=1;
ans=1%p;
while(b)
{
if(b%2)ans=ans*a%p; //如果b%2==1就执行
a=a*a%p; //每次都更新a的值,为上一次的平方
b/=2; //b除以2相当于移到b二进制的下一位
}
cout<<ans<<endl;
return 0;
}
实例2(acwing89. a^b)
求 a乘 b对 p 取模的值。
输入格式
第一行输入整数a,第二行输入整数b,第三行输入整数p。
输出格式
输出一个整数,表示a*b mod p
的值。
数据范围
1≤a,b,p≤10181
输入样例:
3
4
5
输出样例:
2
解题思路
代码实现
#include<iostream>
using namespace std;
int main(){
unsigned long long a,b,p,ans=0;
cin>>a>>b>>p;
while(b){
if(b&1)ans=(ans+a)%p;
a*=2;
a%=p;
b>>=1;
}
cout<<ans<<endl;
return 0;
}
我这比较简陋详解请看
AcWing 89. a^b(寒假每日一题) - AcWinghttps://www.acwing.com/video/2347/AcWing 90. 64位整数乘法 - AcWing
https://www.acwing.com/video/108/