提交时间:2023-08-16 12:20:36

运行 ID: 98675

#include<bits/stdc++.h> using namespace std; const int mod=1'000'000'007; int Plus(int x,int y){ x+=y; if(x>=mod)return x-mod; return x; } int Times(int x,int y){ return 1ll*x*y%mod; } int Pow(int x,int y){ int s=1; while(y){ if(y&1)s=Times(s,x); x=Times(x,x);y>>=1; } return s; } const int maxn=100'000; const int part=317; int jc[maxn+5],nc[maxn+5]; int tl[part+2][part+2]; int C(int n,int m){ if(m>n)return 0; return Times(jc[n],Times(nc[m],nc[n-m])); } int main(){ jc[0]=nc[0]=1; for(int i=1;i<=maxn;i++) jc[i]=Times(jc[i-1],i), nc[i]=Pow(jc[i],mod-2); int val; for(int i=0;i*part<=maxn;i++){ val=0; for(int j=0;j<=i*part;j++){ val=Plus(val,C(i*part,j)); if(j%part==0)tl[i][j/part]=val; } } int t,n,k,tn,tk; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&k); tn=n/part;tk=k/part;val=tl[tn][tk]; tn*=part;tk*=part; while(tn<n){ val=Plus(Plus(val,val),mod-C(tn,tk)); tn++; } while(tk<k){ tk++; val=Plus(val,C(tn,tk)); } printf("%d\n",val); } return 0; }