提交时间:2023-08-16 19:24:17

运行 ID: 98837

#include<bits/stdc++.h> #define int long long using namespace std; const int N=1e5+5,mod=1e9+7; int t,id[N],tim[N]; struct node{ int id,n,k,whe,ans; }q[N]; bool cmp(node a,node b){ if(a.whe==b.whe) return a.n<b.n; else return a.whe<b.whe; } int qpow(int x,int y){ int sum=1; while(y>0){ if(y&1) sum=sum*x%mod; x=x*x%mod; y>>=1; } return sum; } int cale(int n,int k){ return tim[n]*qpow(tim[k],mod-2)%mod*qpow(tim[n-k],mod-2)%mod; } bool cmp2(node a,node b){ return a.id<b.id; } signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin>>t; int len=sqrt(1e5); for(int i=1;i<=t;++i){ cin>>q[i].n>>q[i].k; q[i].whe=(q[i].k-1)/len+1; q[i].id=i; } sort(q+1,q+t+1,cmp); tim[0]=1; for(int i=1;i<=1e5;++i) tim[i]=tim[i-1]*i%mod; int sum=1,n=0,k=0; for(int i=1;i<=t;++i){ for(;k>q[i].k;){ k--; sum=(sum-cale(n,k+1)+mod)%mod; } for(;n<q[i].n;){ n++; sum=(sum*2-cale(n-1,k)+mod)%mod; } for(;k<q[i].k;){ k++; sum=(sum+cale(n,k))%mod; } for(;n>q[i].n;){ n--; sum=(sum+cale(n,k))%mod*qpow(2,mod-2)%mod; } q[i].ans=sum; } sort(q+1,q+t+1,cmp2); for(int i=1;i<=t;++i) cout<<q[i].ans<<'\n'; return 0; }