快速幂问题
问题描述
求 a 的 b 次方对 p 取模的值。
输入格式
三个整数 a,b,p ,在同一行用空格隔开。
输出格式
输出一个整数,表示a^b mod p的值。
数据范围
0≤a,b,p≤109
数据保证 p≠0
输入样例:
3 2 7
输出样例:
2
快速幂思想
如果我们想求37是多少,用最暴力的做法只需要循环进行7次相乘,但是如果我们想求的是31000000,即3的100万次幂呢?
先从3^7开始看
7的二进制表示为111,我们可以发现31=3,32=9,3^4=81,
而3^1 * 3^2 * 3^4 = 3^7
那么100万不会超过2^20
3^1 = 3, 3^2=9, ... , 3^19
找出二进制为1的存在,将这些进行相乘,就可以得到最后的结果
代码如下
#include<iostream>
using namespace std;
int main()
{
int a, b , p;
cin >> a >> b >> p;
int res = 1 % p;
// 求出b的二进制表示
while(b)
{
if(b & 1) res = res * 1ll * a % p; // 如果二进制个位是1就需要把答案乘上a
// 十位就是不断的平方,3^1=1,3^2=9,3^3=27
a = a * 1ll * a % p;
b >>= 1; // 把个位去掉
// 下次循环就是循环10位,依此类推
}
cout << res << endl;
return 0;
}