版权声明:沃斯里德小浩浩啊 https://blog.csdn.net/Healer66/article/details/82559915
链接:https://cn.vjudge.net/contest/250637#problem/A
思路:
求解C(n,k)+C(n,k+1)+...+C(n,n)
因为组合数的总和是2^n
所以转化成 2^n - C(n,0)+C(n,1)+...+C(n,k-1)
求组合数相除时会爆精度,所以用逆元处理。
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
ll quick(ll a,ll b)
{
ll ans = 1;
a%=mod;
while(b)
{
if(b&1)
{
ans= ans*a%mod;
}
a=a*a%mod;
b>>=1;
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
ll n,k,i;
int cas=1,t;
cin>>t;
while(t--)
{
cin>>n>>k;
ll ans=quick(2,n)-1; //2^n - C(n,0)
ll cur =n;
for(int i=1; i<k; i++)
{
ans=(ans+mod-cur)%mod;
cur=cur*(n-i)%mod;
cur=cur*quick(i+1,mod-2)%mod;//逆元
}
cout<<"Case #"<<cas++<<": "<<ans<<endl;
}
return 0;
}