其他分享
首页 > 其他分享> > 龟速幂

龟速幂

作者:互联网

类似与快速幂。

 

 

由于数据范围很大,我们不能直接用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;
}

 

标签:龟速,cout,二进制,res,long,ULL
来源: https://www.cnblogs.com/MoonSkyy/p/15942092.html