提交时间:2023-12-20 19:27:53

运行 ID: 24246

#include <bits/stdc++.h> #define PLI pair<LL,int> #define LL long long using namespace std; const int MOD=1e9+7; int N,T,E; LL dp[505][125005]; LL sum[125005]; LL frac[505]; LL QPow(LL base,int po) { LL res=1; while(po) { if(po&1) res=res*base%MOD; base=base*base%MOD; po>>=1; } return res; } void PreFunc() { frac[0]=1; for(int i=1;i<=50;i++) frac[i]=frac[i-1]*i%MOD; dp[1][0]=1; dp[2][0]=1,dp[2][1]=1; sum[0]=1,sum[1]=2; for(int i=2;i<=125000;i++) sum[i]=2; for(int i=3;i<=500;i++) { int limit=i*(i-1)/2; for(int j=0;j<=limit;j++) { dp[i][j]=sum[j]; if(j-i>=0) dp[i][j]-=sum[j-i]; dp[i][j]=(dp[i][j]%MOD+MOD)%MOD; } for(int j=0;j<=125000;j++) sum[j]=0; sum[0]=dp[i-1][0]; for(int j=1;j<=125000;j++) sum[j]=(sum[j-1]+dp[i][j])%MOD; } /* for(int i=1;i<=5;i++) { for(int j=0;j<=25;j++) printf("%lld ",dp[i][j]); puts(""); }*/ for(int i=1;i<=500;i++) { int limit=i*(i-1)/2; for(int j=1;j<=limit;j++) dp[i][j]=(dp[i][j]+dp[i][j-1])%MOD; } return; } int main() { scanf("%d",&T); //printf("%d\n",T); PreFunc(); while(T--) { scanf("%d %d",&N,&E); E=min(E,N*(N-1)/2); LL ans=0; for(int i=1;i<=N;i++) { int e=min(E,i*(i-1)/2); LL res=1ll*(N-i+1)*dp[i][e]%MOD; LL mulf=1ll*frac[N]*QPow(frac[i],MOD-2)%MOD; mulf=mulf*mulf%MOD; // printf("%d %lld %lld\n",i,mulf,res); res=res*mulf%MOD; ans+=res; } ans%=MOD; printf("%lld\n",ans); } return 0; }