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

AcWing 90. 64位整數乘法(快速乘)

技術標籤:Acwing 演算法提高課演算法題資料結構演算法

題目描述
求 a 乘 b 對 p 取模的值。
資料範圍
1≤a,b,p≤10^18

樣例
輸入樣例:
3
4
5
輸出樣例:
2
演算法1
(二進位制思想) \mathcal{O}(log n)
如果直接計算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;
}