1. 程式人生 > 其它 >AcWing 90. 64位整數乘法

AcWing 90. 64位整數乘法

題目傳送門

一、解題思路

核心:二進位制思想

如果直接計算\(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\)

翻番。類比一下快速冪,那個是\(a*a\),這裡是\(a+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;
}