HDU 5187 (快速冪 + 快速乘) == 高精度快速冪
阿新 • • 發佈:2020-09-16
這個找規律可以發現 結果是 2^n-2 ,但是直接用快速冪的,精度會爆掉(WA了兩次),所以快速冪裡面的乘法部分用快速乘來展開,解決掉精度的問題
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll qmul(ll a , ll b, ll mod) { ll ans = 0 ; while(b){ if(b&1) ans = (ans + a) % mod; a += a; a%=mod; b>>=1; } return ans; } ll qpow(ll a , ll b , ll mod) { ll ans = 1 , base = a; while(b){ if(b&1) ans = qmul(ans,base,mod) % mod ; base = qmul(base,base,mod); base %= mod; b>>=1; } return ans%mod; } int main() { ll n , mod;while(cin>>n>>mod){ ll temp = qpow(2,n,mod); if(mod==1){ cout<<"0"<<endl; continue; } if(temp == 0 ){ cout<<mod-2<<endl; }else if(temp == 1 ){ cout<<mod-1<<endl; }else{ cout<<temp-2<<endl; } } return 0; }