Gym - 101775A与快速幂和除法求模

首先是快速幂的算法

ll qpow(ll base ,ll power)
{
    ll pro=1;
    while(power){
        if(power&1) pro=pro*base%mod;
        base=base*base%mod;
        power>>=1;
    }
    return pro;
}

其次是求逆元
什么是逆元
当求解公式:(a/b)%m 时,因b可能会过大,会出现爆精度的情况,所以需变除法为乘法:
设c是b的逆元,则有bc≡1(mod m);
则(a/b)%m = (a/b)1%m = (a/b)bc%m = ac(mod m);
即a/b的模等于a
b的逆元的模;
逆元就是这样应用的;

//逆元:
ll inv(ll a){
    return qpow(a, mod-2);  // qpow()是快速幂
}

要知道2^n=Cn0+Cn1+…+Cnn;
Gym - 101775A

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll mod=1e9+7;
ll qpow(ll base ,ll power)
{
    ll pro=1;
    while(power){
        if(power&1) pro=pro*base%mod;
        base=base*base%mod;
        power>>=1;
    }
    return pro;
}
int main()
{
    int T;
    cin>>T;
    ll a,b;
    for(int i=1;i<=T;i++){
        cin>>a>>b;
        ll all=qpow(2,a);//将所求的题转变一下思路,要直接求再怎么优化也要超时
        ll m=1,sum=1;
        for(ll j=1;j<b;j++){
            m=(m%mod*(a-j+1)%mod)%mod;
            m=(m%mod*qpow(j,mod-2)%mod)%mod;
            sum=(sum%mod+m%mod)%mod;
        }
        printf("Case #%d: %lld\n",i,(all-sum+mod)%mod);
    }
}

要知道2^n=Cn0+Cn1+…+Cnn;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值