AcWing 90. 64位整數乘法
阿新 • • 發佈:2022-05-25
一、解題思路
核心:二進位制思想
如果直接計算\(a\)乘\(b\)這會超過 \(long\) \(long\) 的最大範圍,所以採用類似於快速冪的思想
把\(b\)寫成二進位制形式,然後如果某位上為\(1\)就加上它\(a*(2^n)\)次方(\(n\)與這位的位置有關)
並且每次計算後取模就可以了。
例:計算 \(3*7\)
\(7\)的二進位制 \(111\)
\(3*(2^0)=3\)
\(3*(2^1)=6\)
\(3*(2^2)=12\)
觀察可發現每次的可由前一次\(*2\)推出(記得取模)
比如:\(3,6,12,24,...\),其實\(a*b\)可以理解為每次數字\(a\)
時間複雜度分析:\(logn\)
二、實現程式碼
#include <bits/stdc++.h> using namespace std; typedef long long LL; LL a, b, p, res; int main() { cin >> a >> b >> p; while (b) { if (b & 1) res = (res + a) % p; a = (a + a) % p; b >>= 1; } cout << res << endl; return 0; }