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