1. 程式人生 > >【位運算加速】64位整數乘法

【位運算加速】64位整數乘法

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 typedef long long ll;
 5  
 6 int main(){
 7     ll a,b,p;
 8     bool flag=true;//true代表+
 9     cin>>a>>b>>p;
10     /*符號的判斷*/
11     if(a<0) {flag=!flag;a=-a;}
12     if(b<0) {flag=!flag;b=-b;}
13
if(a>b) swap(a,b);//我選擇b分解 14 ll ans=0; 15 while(b){ 16 if(b&1) ans=(ans+a)%p; 17 a=(a*2)%p;//注意分解的是b,但是利用的是b分解成二進位制的結果,跟冪運算相似 18 b/=2; 19 } 20 if(flag) cout<<ans; 21 else cout<<-1*ans; 22 return 0; 23 } 24 25 /**************************************************************
26 Problem: 7779 27 User: qut201801 28 Language: C++ 29 Result: 正確 30 Time:2 ms 31 Memory:2020 kb 32 ****************************************************************/

需要注意幾點,就是

我利用冪運算的思想,就是可以把任意一個數字轉化為一個二進位制冪的和,利用二進位制冪的和來進行乘法運算,這個時候對其中的數字進行取模是不會爆棧的

就是防止精度溢位

b的分解利用的是?2^0+?2^1+~~~~+?2^k;

而根據冪運算的思想來說

我們可以根據b&1(最後一位來判斷,是否去×)

能麼base的指數提升,就相當於a*2