快速幂

快速幂

先放题目

求 a 的 b 次方对 p 取模的值。

输入格式

三个整数 a,b,p,在同一行用空格隔开。

输出格式

输出一个整数,表示a^b mod p的值。

数据范围

0≤a,b≤\(1e9\)
1≤p≤\(1e9\)

输入样例:

3 2 7

输出样例:

2

这个数据一看就知道直接求幂,肯定当场就无了。

众所周知,一个十进制数可以由二进制数 \(2^0 , 2^1\)……等表示出来,所以我们求\(a^b\),可以把b化为二进制.

现在我们对b从最低位开始看,如果不为0,就让结果乘以当前的b位数对应的幂。

#include <iostream>
using namespace  std;
typedef long long LL;
int qmi(int a,int b,int p){
	int res=1%p;
	while(b){
		if(b&1) res=(LL)res*a%p;//为了防止res*a超出int 先转为long long 
		a=(LL)a*a%p;
		b=b>>1;
	}
	return res;
}
int main(){
	int a,b,p;
	cin>>a>>b>>p;
	cout<<qmi(a,b,p)<<endl;
	return 0;
}

为了防止res*a超出int 先转为long long

posted @ 2021-06-06 13:16  sleepzzw  阅读(49)  评论(0)    收藏  举报