64位整数乘法讲解-And-AcWing-90. 64位整数乘法-《算法竞赛进阶指南》
Posted Tisfy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了64位整数乘法讲解-And-AcWing-90. 64位整数乘法-《算法竞赛进阶指南》相关的知识,希望对你有一定的参考价值。
64位整数乘法
题目描述
求 a ∗ b a*b a∗b对 m o d mod mod取模的值
1 ≤ a , b , m o d ≤ 1 0 18 1\\leq a,b,mod\\leq 10^{18} 1≤a,b,mod≤1018
问题分析
先不考虑 _ _ i n t 128 \\_\\_int128 __int128
类似于快速幂的思想, b = c k − 1 2 k − 1 + c k − 2 2 k − 2 + ⋯ + c 0 2 0 b=c_{k-1}2^{k-1}+c_{k-2}2^{k-2}+\\cdots+c_02^0 b=ck−12k−1+ck−22k−2+⋯+c020
因此: a ∗ b = a ∗ c k − 1 2 k − 1 + a ∗ c k − 2 2 k − 2 + ⋯ + a ∗ c 0 2 0 a*b=a*{c_{k-1}2^{k-1}}+a*{c_{k-2}2^{k-2}}+\\cdots+a*{c_02^0} a∗b=a∗ck−12k−1+a∗ck−22k−2+⋯+a∗c020
也就是说如果 b b b的第 i i i位 c i c_i ci是 0 0 0,那么 a ∗ c i 2 i a*{c_{i}2^{i}} a∗ci2i就等于 a ∗ 0 = 0 a*0=0 a∗0=0;如果 c i c_i ci是 1 1 1,那么就等于 a ∗ 2 i a*{2^i} a∗2i
又有 a ∗ 2 i = ( a ∗ 2 i − 1 ) ∗ 2 a*{2^i}=(a*{2^{i-1}})*2 a∗2i=(a∗2i−1)∗2,而 k = l o g 2 ( ⌈ b + 1 ⌉ ) k=log_2(\\lceil b+1\\rceil) k=log2(⌈b+1⌉)( ⌈ ⌉ \\lceil\\rceil ⌈⌉表示向上取整),故时间复杂度为 O ( l o g 2 b ) O(log_2b) O(log2b)
所以每次取 b b b中的 1 1 1位( b & 1 , b > > = 1 b\\&1,b>>=1 b&1,b>>=1),每次 a a a都乘 2 2 2( a = a ∗ 2 % m o d a=a*2\\%mod a=a∗2%mod),如果 b b b的这一位是 1 1 1就累加到 a n s ans ans中。
64位整数乘法模板
typedef long long ll;
ll mul(ll a, ll b, ll mod)
{
ll ans=0;
while(b)
{
if(b&1)
ans = (ans+a)%mod;
a = a*2%mod;
}
return ans;
}
AcWing-90. 64位整数乘法
Problem Description
求 a ∗ b a*b a∗b对 m o d mod mod取模的值
Tips
1 ≤ a , b , m o d ≤ 1 0 18 1\\leq a,b,mod\\leq 10^{18} 1≤a,b,mod≤1018
AC代码
/*
* @Author: LetMeFly
* @Date: 2021-07-26 18:44:35
* @LastEditors: LetMeFly
* @LastEditTime: 2021-07-26 18:50:06
*/
#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a))
#define dbg(x) cout << #x << " = " << x << endl
#define fi(i, l, r) for (int i = l; i < r; i++)
#define cd(a) scanf("%d", &a)
typedef long long ll;
ll mul(ll a, ll b, ll mod)
{
ll ans = 0;
while (b)
{
if (b & 1)
ans = (ans + a) % mod;
a = a * 2 % mod;
b >>= 1;
}
return ans;
}
int main()
{
ll a, b, c;
cin >> a >> b >> c;
cout << mul(a, b, c) << endl;
return 0;
}
原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/119147862
以上是关于64位整数乘法讲解-And-AcWing-90. 64位整数乘法-《算法竞赛进阶指南》的主要内容,如果未能解决你的问题,请参考以下文章
64位整数乘法讲解-And-AcWing-90. 64位整数乘法-《算法竞赛进阶指南》