快速幂算法通常用在求 A^B%C 的时候,因为当B足够大的时候 n与logn 的差距就非常巨大了。并且B十分巨大的时候通常我们已经存不下这个数值了。所以一般要对一个C 取模。
普通n个a相乘复杂度为O(n),快速幂由于是用二进制分开计算并且每次的值在下次计算的时候都会重复利用 所以复杂度为O(logn)。
- 首先假设 B 化为2进制为 a1 + b2 + c4 + d8 + E16 …………………… 所以 A^B = A^(a1)*A^(b2)*……… 这里我们先拿小点的数字做个假设吧。 B=13 A=13; 那么 13^13 = 13 + 13^4 + 13^8 那么这些abcd是怎么确定的呢?
- 我们可以用到与运算来计算b在某位是否存在。如果存在的话即 b&1 ==1 并且每次操作 将b右移一位。这个时候再将a*a 得到a^2 ,重复该操作将会得到a^4 8次方。如果某位存在的话,将其与当前的a相乘,得到值。
- 既然B十分大,那么有可能会产生a的2^n次方时比 long long 还大。这时就会溢出。所以这个时候可以用加法来模拟乘法。并且每次相加都对C取模,这样就不会溢出了。
#include<iostream>
using namespace std;
typedef long long ll;
ll quickadd(ll a,ll b ,ll mod)//模拟加法
{
ll res=0;
while(b>0)
{