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

时间:2020-09-16
本文章向大家介绍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;
}

原文地址:https://www.cnblogs.com/Li-ningning/p/13680167.html