快速幂求解a^b%p
(1)题目内容
求a的b次方对p取模的值
(2)输入格式
三个整数a,b,p,在同一行用空格隔开。
(3)输出格式
输出一个整数,表示a^b mod p
的值。
(4)数据范围
1≤a,b,p≤10ⁿ(n=9)
(5)输入样例
3 2 7
(6)输出样例
2
(7)分析
直接循环容易程序运行超时
快速幂基本思想
//分析
①3^7=?
7 = 111
3^1 = 3
3^2 = 9
3^4 = 81
(凑次方)
3^7 = (3^1)*(3^2)*(3^4)
② 3^9 = ?
9 = 1001
3^1 = 3
3^2 = 9
3^4 = 81
3^8 = 6561
3^9 = (3^1)*(3^8)//1001
所以 3^1000000 =
1000000 = (写出其二进制)
3^1 = 3
3^2 = 9
3^4 = 81
3^8 = 6561
3^16
...
3^(2^19) =
(8)代码实现
#include<iostream>
//#include<bits/stdc++>//万能头文件,但编译时间会变慢,所以简单程序就能不写就不写
using namespace std;
int main(){
int a,b,p;
cin>>a>>b>>p;
int res = 1%p;//为什么要%p? 因为若b=0,则直接不进入下面的循环
while(b){
if(b&1) //b&1 即取b的个位数
res = res * 1ll * a % p; //1ll 强制类型转换 因为res*a可能会发生溢出,所以强制类型转换为long long 类型
a = a * 1ll * a % p; //b的十位是每次循环进行平方
b>>=1; //去掉个位
}
cout<<res<<endl;
return 0;
}
(9)快速幂解题模板
//求 m^k mod p,时间复杂度 O(logk)。
int qmi(int m, int k, int p)
{
int res = 1 % p, t = m;
while (k)
{
if (k&1) res = res * t % p;
t = t * t % p;
k >>= 1;
}
return res;
}