A.Chat Group   

    不难发现,题目中让我们求的式子为:Gym 101775 2017-2018 ACM-ICPC Asia East Continent League Final (EC-Final 2017)

    而很显然,因为n相当的大,因此直接做的话绝对会超时,因此考虑将式子转化。

    根据组合数的公式,上述的式子可以转化为:Gym 101775 2017-2018 ACM-ICPC Asia East Continent League Final (EC-Final 2017)

    因为此时的k比较小,因此我们利用组合数公式递推求解。

#include <bits/stdc++.h>
#define maxn 100005
using namespace std;
typedef long long ll;
ll inv[maxn+20];
const int mod=1e9+7;
void init(){
    inv[1]=inv[0]=1;
    for(int i=2;i<=maxn;i++){
        inv[i]=(mod-mod/i)*inv[mod%i]%mod;
    }
}
ll powmod(ll a,ll b){
    ll res=1;
    while(b){
        if(b&1) res=res*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return res;

}
int main()
{
    init();
    int t,n,k,cnt=0;
    scanf("%d",&t);
    while (t--){
        scanf("%d %d",&n,&k);
        ll res=1,y=n,sum=1;
        for (int i=1;i<k;i++){
            res=res*y%mod*inv[i]%mod;
            y--;
            sum=(res+sum)%mod;
        }
        ll ans=(powmod(2,n)-sum+mod)%mod;
        printf("Case #%d: %lld\n",++cnt,ans);
    }
    return 0;
}
View Code

相关文章: