快速乘模板

问题描述

\(a\)\(b\)\(p\) 取模的值。
\(1≤a,b,p≤10_{18}\)

问题分析

\(a * b\)会爆炸long long,考虑将b视为二进制数,只需要执行\(log_b\)次加法并实时取模即可不爆long long完成乘法的计算

代码实现

#include <iostream>

using namespace std;

typedef long long LL;

LL qmul(LL a, LL b, LL p)
{
    LL res = 0;
    while (b)
    {
        if (b & 1) res = (res + a) % p;
        a = (a * 2) % p;
        b >>= 1;
    }
    return res;
}
int main()
{
    LL a, b, p;
    cin >> a >> b >> p;
    
    cout << qmul(a, b, p) << endl;
    
    return 0;
}
posted @ 2021-03-04 14:32  0x7F  阅读(70)  评论(0编辑  收藏  举报