提交时间:2023-08-16 20:25:34

运行 ID: 98850

#include<bits/stdc++.h> using namespace std; #define ll long long template<typename T>inline void read(T &ret){ ret=0;T fh=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')fh=-1;ch=getchar();} while(isdigit(ch))ret=(ret<<1)+(ret<<3)+(ch^48),ch=getchar(); ret*=fh; } template<typename T>inline void write(T ret,bool flag){ if(ret<0)putchar('-'),ret*=-1; static char out[25];int top=0; do{out[++top]=(ret%10)^48,ret/=10;}while(ret); for(;top;--top)putchar(out[top]); putchar(flag?' ':'\n'); } const int N=1e5+5,kc=320,m=1e5; const ll mod=1e9+7; ll t,fac[N],inv[N],ans[N],bl[N]; struct qus{ int n,k,id; inline bool operator < (const qus x)const{ return bl[n]==bl[x.n]?bl[n]&1?k<x.k:k>x.k:n<x.n; } }q[N]; inline ll ksm(ll x,ll y){ ll sum=1; for(;y;y>>=1){ if(y&1)sum=(sum*x)%mod; x=x*x%mod; } return sum; } inline ll C(ll x,ll y){ return fac[x]*inv[x-y]%mod*inv[y]%mod; } int main(){ // freopen("ssh.in","r",stdin); // freopen("ssh.out","w",stdout); for(int i=1;i<=m;++i) bl[i]=(i-1)/kc+1; fac[0]=inv[0]=1; for(int i=1;i<=m;++i){ fac[i]=fac[i-1]*i%mod; inv[i]=ksm(fac[i],mod-2); } read(t); for(int i=1;i<=t;++i){ read(q[i].n); read(q[i].k); q[i].id=i; } sort(q+1,q+t+1); int n=0,k=0,sum=1; for(int i=1;i<=t;++i){ while(k>q[i].k)sum=(sum-C(n,k--)+mod)%mod; while(n<q[i].n)sum=((sum<<1)%mod-C(n++,k)+mod)%mod; while(n>q[i].n)sum=1ll*(sum+C(--n,k))%mod*inv[2]%mod; while(k<q[i].k)sum=(sum+C(n,++k))%mod; ans[q[i].id]=sum; } for(int i=1;i<=t;++i) write(ans[i],0); return 0; }