AcWing 90. 64位整數乘法(快速乘)
阿新 • • 發佈:2021-02-10
題目描述
求 a 乘 b 對 p 取模的值。
資料範圍
1≤a,b,p≤10^18
樣例
輸入樣例:
3
4
5
輸出樣例:
2
演算法1
(二進位制思想)
如果直接計算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推出(記得取模)
時間複雜度分析:logn
#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
int main()
{
ll a,b,p,res;
cin>>a>>b>>p;
res=0;
while(b)
{
if(b&1)
res=(res+a)%p;
b>>=1;
a=2*a%p;
}
cout<<res<<endl;
return 0;
}