码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-09-18 03:16:57      阅读:28      评论:0      收藏:0      [点我收藏+]

标签:type   namespace   mod   快速乘   using   include   乘法   ace   turn   

 

这个找规律可以发现   结果是  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;
}

 

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

标签:type   namespace   mod   快速乘   using   include   乘法   ace   turn   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!