引入
一道题,让你求 a b m o d p a^bmod\,p abmodp一般做法是,直接乘
int mul=1;
for(int i = 1; i <= b;i++)
{
mul*=b;
}
mul%=p;
但是这种做法在b很大的时候数据会炸
所以要优化一下
int mul=1;
for(int i = 1; i <= b;i++)
{
mul*=b;
mul%=p;
}
那为什么可以这样呢,因为
积的余数等于余数的积(自己慢慢理解,可以举例)
但是这种方法也有缺点,未免太慢了吧,时间复杂度是
O
(
n
)
O(n)
O(n)
更快的方法
即使我们不用每次都一个一个乘,比如
9
4
9^4
94,你先算出了
9
2
=
81
9^2=81
92=81
那么后面你可以直接
8
1
2
=
6561
81^2=6561
812=6561
如果直接算要乘3次,但这样就只用乘2次,所以
a
n
=
a
n
/
2
∗
a
n
/
2
a^n=a^{n/2}*a^{n/2}
an=an/2∗an/2
那如果
9
5
9^5
95怎么办?
令
t
=
1
t=1
t=1
可以先把指数5减去1,等于4,
t
=
t
∗
a
(
a
是
目
前
的
底
数
)
t=t*a(a是目前的底数)
t=t∗a(a是目前的底数)
然后再继续算。
那么这就是快速幂
代码
long long power(long long a, long long b, long long p)
{
long long t = 1;
while (b > 0)
{
if (b % 2==1) t = t * a %p;
b/=2;
a = a * a %p;
}
return t;
}