提交时间:2023-12-22 13:24:19

运行 ID: 117124

#include<bits/stdc++.h> using namespace std; const int mod=1000000007; int t,bn,now=1,fac[100005],vac[100005],ans[100005]; struct query{ int n,m,id; }q[100005]; bool cmp(query a,query b){ return a.m/bn==b.m/bn?(a.m/bn&1?a.n/bn<b.n/bn:a.n/bn>b.n/bn):a.m/bn<b.m/bn; } template<typename T>T qpow(T a,T b,T n,T ans=1){ for(a%=n;b;b>>=1) b&1&&(ans=ans*a%n),a=a*a%n; return ans; } template<typename T>T inv(T a,T b) { return qpow(a,b-2,b); } int C(int n,int m){ return 1ll*fac[n]*vac[m]%mod*vac[n-m]%mod; } signed main(){ fac[0]=1; for(int i=1;i<=100000;i++) fac[i]=1ll*fac[i-1]*i%mod; vac[0]=1,vac[100000]=inv((long long)fac[100000],(long long)mod); for(int i=99999;i>=1;i--) vac[i]=1ll*vac[i+1]*(i+1)%mod; cin>>t; for(int i=1;i<=t;i++) cin>>q[i].n>>q[i].m,q[i].id=i; bn=sqrt(100000),sort(q+1,q+t+1,cmp); for(int i=1,n=1,m=0;i<=t;i++){ while(m>q[i].m) now=(now-C(n,m--)+mod)%mod; while(n<q[i].n) now=(now*2ll-C(n++,m)+mod)%mod; while(m<q[i].m) now=(now+C(n,++m))%mod; while(n>q[i].n) now=(now+C(--n,m))%mod*500000004ll%mod; ans[q[i].id]=now; } for(int i=1;i<=t;i++) cout<<ans[i]<<'\n'; return 0; }