龟速幂

类似与快速幂。

龟速幂

 

 

由于数据范围很大,我们不能直接用a*b 否则会爆longlong。

我们同样可以采用将b拆分成其对应的二进制形式,然后再用a去乘。

比如说: 4*5 = 4 * (101) = 4*(2^2+2^0)

同样,不管b的二进制最后一位是否为1,a都要乘2,如果是1,结果就乘上a,如果是0,就不乘。然后去看b的下一位是否为1,直到b为0;

模板:

#include <iostream>
using namespace std;
typedef unsigned long long ULL;

ULL qmi(ULL a, ULL b, ULL p)
{
    ULL res = 0;
    while(b)
    {
        if(b&1) res = (res + a) % p;
        b >>= 1;
        a = a * 2 % p;
    }
    
    return res;
}
int main()
{
    ULL a, b, p;
    cin >> a >> b >> p;
    cout << qmi(a, b, p) << endl;
    
    return 0;
}

 

上一篇:opencv系列之ubuntu系统下编译python版本的opencv(指定特定的ffmpeg)


下一篇:数位dp