A.Chat Group
不难发现,题目中让我们求的式子为:
而很显然,因为n相当的大,因此直接做的话绝对会超时,因此考虑将式子转化。
根据组合数的公式,上述的式子可以转化为:
因为此时的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; }