组合数的递推公式
题目:5.10 周练 - Virtual Judge (vjudge.net)
思路:通过组合数递推公式加逆元的方式进行递推计算
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod=1e9+7;
ll cnt,sum;
ll qpow(ll a,ll b){
ll res=1;
while(b){
if(b&1) res*=a;
res%=mod;
a*=a;
a%=mod;
b>>=1;
}
return res;
}
void solve(){
ll n,k;
cin>>n>>k;
ll ans=qpow(2,n)-1;
ll tt=n;
for(int i=1;i<k;i++){
ans=(ans-tt+mod)%mod;
tt=tt*(n-i)%mod*qpow(i+1,mod-2)%mod; //组合数递推加快速幂求逆元
}
printf("Case #%lld: %lld\n",cnt,(ans+mod)%mod);
}
//void init(){ //失败的想法
// ll ans=1;
// in[1]=1;
// for(int i=1;i<=100010;i++){
// in[i]=ans*i;
// in[i]%=mod;
// }
//}
int main(){
int t;
cin>>t;
// init();
while(t--){
cnt++;
solve();
}
}