快速幂介绍
快速幂是用了二进制优化。
模板题
P1226 【模板】快速幂
#include<bits/stdc++.h>
using namespace std;
#define int long long
int fast_pow(int a,int b,int mod)//分别是底数、幂次、模式
{
int ans = 1;//答案
while(b)
{
if(b & 1)
{
ans = (ans * a)% mod;
}
a = a * a % mod;//a=a^2
b >>= 1;
}
return ans;
}
signed main()
{
int a,b,p;
cin >> a >> b >> p;
printf("%d^%d mod %d=%d",a,b,p,fast_pow(a,b,p));
return 0;
}
比如a=10,b=10,mod=145141919810。
b=
(
1010
)
2
(1010)_2
(1010)2
所以
a
b
=
a
10
=
a
2
1
×
a
2
3
a^b=a^{10}=a^{2^1}\times a^{2^3}
ab=a10=a21×a23
可以把时间复杂度优化到
O
(
l
o
g
n
)
O(logn)
O(logn)
模板代码
int fast_pow(int a,int b,int mod)
{
int ans = 1;
while(b)
{
if(b & 1)
{
ans = (ans * a)% mod;
}
a = a * a % mod;
b >>= 1;
}
return ans;
}