题意:
给定n,k,要求计算 ∑ i = k n C ( n , i ) \sum_{i=k}^nC(n,i) ∑i=knC(n,i)
数据范围:n<=1e9,k<=1e5
解法:
虽 然 n 很 大 , 但 是 k 很 小 , 考 虑 从 k 入 手 虽然n很大,但是k很小,考虑从k入手 虽然n很大,但是k很小,考虑从k入手
a n s = ∑ i = k n C ( n , i ) = 2 n − ∑ i = 0 k − 1 C ( n , i ) ans=\sum_{i=k}^nC(n,i)=2^n-\sum_{i=0}^{k-1}C(n,i) ans=∑i=knC(n,i)=2n−∑i=0k−1C(n,i)
但 是 n 非 常 大 , 无 法 直 接 计 算 出 C ( n , i ) 但是n非常大,无法直接计算出C(n,i) 但是n非常大,无法直接计算出C(n,i)
C ( n , m ) = n ! m ! ( n − m ) ! C(n,m)=\frac {n!}{m!(n-m)!} C(n,m)=m!(n−m)!n!
C ( n , m − 1 ) = n ! ( m − 1 ) ! ( n − m + 1 ) ! C(n,m-1)=\frac {n!}{(m-1)!(n-m+1)!} C(n,m−1)=(m−1)!(n−m+1)!n!
C ( n , m ) = C ( n , m − 1 ) ∗ ( n − m + 1 ) m C(n,m)=\frac {C(n,m-1)*(n-m+1)}{m} C(n,m)=mC(n,m−1)∗(n−m+1)
从 C ( n , 0 ) 开 始 递 推 C ( n , i ) 即 可 从C(n,0)开始递推C(n,i)即可 从C(n,0)开始递推C(n,i)即可
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=1e5+5;
const int mod=1e9+7;
int ppow(int a,int b,int mod){
int ans=1%mod;a%=mod;
while(b){
if(b&1)ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
signed main(){
int T;scanf("%lld",&T);
int cas=1;
while(T--){
int n,k;scanf("%lld%lld",&n,&k);
int ans=ppow(2,n,mod);
int now=1;//C(n,0)
for(int i=1;i<=k;i++){
ans=(ans-now)%mod;
now=now*(n-i+1)%mod*ppow(i,mod-2,mod)%mod;
}
ans=(ans%mod+mod)%mod;
printf("Case #%lld: %lld\n",cas++,ans);
}
return 0;
}