1. 程式人生 > 實用技巧 >HDU 5187 (快速冪 + 快速乘) == 高精度快速冪

HDU 5187 (快速冪 + 快速乘) == 高精度快速冪

這個找規律可以發現 結果是 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; }