码迷,mamicode.com
首页 > 其他好文 > 详细

快速乘模板

时间:2021-03-05 12:57:03      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:二进制   模板   lin   block   pre   namespace   space   out   cout   

问题描述

\(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;
}

快速乘模板

标签:二进制   模板   lin   block   pre   namespace   space   out   cout   

原文地址:https://www.cnblogs.com/G-H-Y/p/14480125.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!