【位运算加速】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

猜你喜欢

转载自www.cnblogs.com/rign/p/10032394.html