提交时间:2023-08-16 12:11:02
运行 ID: 98643
#include<bits/stdc++.h> using namespace std; #define ll long long const int mod=1e9+7; const int N=5e5+10; ll Q,n,k,jc[N],inv[N]; inline ll kpow(ll x,ll n){ if(n==0)return 1; if(n==1)return x; if(n&1)return kpow(x*x%mod,n>>1)*x%mod; return kpow(x*x%mod,n>>1); } ll work(){ jc[0]=1; for(ll i=1;i<=N;i++)jc[i]=jc[i-1]*i%mod; for(ll i=0;i<=N;i++)inv[i]=kpow(jc[i],mod-2); } inline void read(ll &x){ x=0;bool f=0;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=1;c=getchar();} while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); if(f)x=-x; } ll sum[N],pos,nn[N],kk[N]; int main(){ // freopen("ssh.in","r",stdin); // freopen("ssh.out","w",stdout); work(); read(Q); for(ll j=1;j<=Q;j++){ read(nn[j]);read(kk[j]); } bool f1=1; for(ll j=2;j<=Q;j++){ if(nn[j]!=nn[j-1]){ f1=0; break; } } if(f1){ sum[0]=inv[0]*inv[nn[1]]%mod; for(ll i=1;i<=nn[1];i++){ sum[i]=sum[i-1]+inv[i]*inv[nn[i]-i]; sum[i]%=mod; } for(ll i=1;i<=Q;i++){ cout<<sum[kk[i]]*jc[nn[i]]%mod<<endl; } } else{ for(ll j=1;j<=Q;j++){ n=nn[j],k=kk[j]; ll ans=0; for(ll i=0;i<=k;i++){ ans=(ans+inv[i]*inv[n-i])%mod; } cout<<ans*jc[n]%mod<<endl; } } return 0; } /* 10 1 1 3 2 5 2 8 3 12 0 642 246 2222 999 2525 21 50000 25000 100000 100000 */