【位運算加速】64位整數乘法
阿新 • • 發佈:2018-11-28
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;} 13if(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