预备知识:
ab%p=((a%p)b)%p
(a+b)%p=(a%p+b)%p
(ab)%c = ((a%c)(b%c))%c
快速幂就是快速求一个数的幂
两个整数a,b,求a^b
把b分解成几个2的次方的和,然后就相当于做一个指数乘法
比如说2^11
11=2^ 3+2^ 1+2^0
ans=2^ (2^ 3+2^ 1+2^ 0)=2^ (2^ 3)*2^ (2^ 1)*2^ (2^0)
快速幂从字面上来讲就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高
下面两个公式在代码中会用到
例题
https://www.acwing.com/problem/content/description/91/题目链接。
方法一
#include<iostream>
using namespace std;
typedef long long LL;
int qmi(int a,int b,int p)
{
int res=1%p;//防止p为1的情况发生,此时的余数为零
while(b)
{
if(b&1) res=(LL)res*a%p;
a=(LL)a*a%p;
b>>=1;
}
return res;
}
int main()
{
int a,b,p;
cin>>a>>b>>p;
cout<<qmi(a,b,p)<<endl;//qmi代表快速幂。
return 0;
}
方法二
#include<iostream>
using namespace std;
int main()
{
long long a, b, p, res=1;
cin >> a >> b >> p;
while (b)
{
if (b & 1)res = res * a % p;//
b >>=1 ;
a = a * a % p;
}
cout << res%p;//控制数据的大小。
}