题意:
就是问你C(n,0)+…C(n,k-1),n是1e9,k是1e5。
思考:
刚开始看到直接写了个lucas,发现模数为1e9+7,肯定超了。发现n那么大,肯定是从k入手,但是好像也没有什么公式啊,怎么都想不出。其实用手写一写就发现了,C(n,m) = C(n,m-1)*(n-m+1)/m。所以可以从第一项开始递推,推到m次就可以了。答案就是2的n次方减去这些的累加和。一定要动手写一些模拟一下。
代码:
int T,n,m,k;
int va[N];
int ksm(int a,int b)
{
int sum = 1;
while(b)
{
if(b&1) sum = sum*a%mod;
a = a*a%mod;
b >>= 1;
}
return sum;
}
signed main()
{
IOS;
cin>>T;
for(int cs=1;cs<=T;cs++)
{
cin>>n>>m;
int ans = ksm(2,n)%mod,sum = 1;
for(int i=1;i<=m;i++)
{
ans = (ans-sum)%mod;
sum = sum*(n-i+1)%mod*ksm(i,mod-2)%mod;
}
ans = (ans%mod+mod)%mod;
cout<<"Case #"<<cs<<": "<<ans<<"\n";
}
return 0;
}
总结:
多多动手写一写。