快速乘模板

时间:2021-03-05 12:57:03   收藏:0   阅读:0

问题描述

\(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;
}
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!