提交时间:2023-12-20 09:53:46

运行 ID: 24233

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) using namespace std; typedef long long ll; const int maxn=1e5+10,mod=1e9+7; inline ll read(){ ll x=0;short t=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; }int n,E,jc[505],jc_inv[505],dp[505][505*505],sum[505*505]; int qpow(int a,int b){ int res=1; while(b){ if(b&1)res=res*1ll*a%mod; a=a*1ll*a%mod;b>>=1; }return res; } int C(int n,int m){return jc[m]*1ll*jc_inv[m-n]%mod*1ll*jc_inv[n]%mod;} void init(){ dp[0][0]=1; up(i,0,500*500)sum[i]=1; up(i,1,500){ up(j,0,i*i){ if(j-i+1>0)dp[i][j]=(sum[j]-sum[j-i]+mod)%mod; else dp[i][j]=sum[j]; }up(j,0,500*500)sum[j]=0; sum[0]=dp[i][0]; up(j,1,500*500)sum[j]=(dp[i][j]+sum[j-1])%mod; } up(i,1,500)up(j,1,500*500)(dp[i][j]+=dp[i][j-1])%=mod; jc[0]=jc_inv[0]=1;up(i,1,500)jc[i]=jc[i-1]*1ll*i%mod,jc_inv[i]=qpow(jc[i],mod-2); } void slv(){ n=read(),E=read(); int res=0; up(i,1,n)(res+=(n-i+1)*1ll*C(i,n)%mod*1ll*C(i,n)%mod*1ll*dp[i][min(E,500*500)]%mod*1ll*jc[n-i]%mod*1ll*jc[n-i]%mod)%=mod; cout<<res<<'\n'; }int main(){ //freopen("perm.in","r",stdin); //freopen("perm.out","w",stdout); init(); int t=read();while(t--)slv(); fclose(stdin); fclose(stdout); return 0; }