提交时间:2023-08-16 10:00:46

运行 ID: 98556

#include<bits/stdc++.h> #define int long long #define mod 1000000007 using namespace std; inline int read(){ int x=0,f=1; char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();} return x*f; } int t,block=316,now=1,bl[100005],fac[100005],ifac[100005],ans[100005]; struct query{int l,r,id;}q[100005]; inline int qpow(int x,int y){ int res=1; while(y){ if(y&1)(res*=x)%=mod; (x*=x)%=mod; y>>=1; } return res%mod; } void init(){ fac[0]=ifac[0]=1; for(int i=1;i<=100000;i++)bl[i]=(i-1)/block+1,fac[i]=fac[i-1]*i%mod; ifac[100000]=qpow(fac[100000],mod-2); for(int i=99999;i;i--)ifac[i]=ifac[i+1]*(i+1)%mod; } bool cmp(query a,query b){return bl[a.r]=bl[b.r]?(bl[a.r]&1?bl[a.l]<bl[b.l]:bl[a.l]>bl[b.l]):bl[a.r]<bl[b.r];} int C(int x,int y){return fac[x]*ifac[y]%mod*ifac[x-y]%mod;} signed main(){ t=read();init(); for(int i=1;i<=t;i++)q[i].l=read(),q[i].r=read(),q[i].id=i; sort(q+1,q+t+1,cmp); for(int i=1,l=1,r=0;i<=t;i++){ while(r>q[i].r)now=(now-C(l,r)+mod)%mod,--r; while(l<q[i].l)now=((now<<1ll)-C(l,r)+mod)%mod,++l; while(r<q[i].r)++r,now=(now+C(l,r))%mod; while(l>q[i].l)--l,now=(now+C(l,r))%mod*((mod>>1ll)+1)%mod; ans[q[i].id]=now; } for(int i=1;i<=t;i++)printf("%lld\n",ans[i]); return 0; }