求助 50pts
#include<bits/stdc++.h>
#define int long long
#define pt putchar(' ')
#define nl puts("")
#define pi pair<int,int>
#define pb push_back
#define go(it) for(auto &it:as[x]) //注意加了&
using namespace std;
const int N=502,M=1e4+10,Q=1e9+7;
int fac[N],nf[N];
int f[N][(N*N)>>1],s[(N*N)>>1];
pi q[M];
int fr(){ //double 不能快读!!!!
int x=0,flag=1;
char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') flag=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=x*10+(ch-'0');
ch=getchar();
}
return x*flag;
}
void fw(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) fw(x/10);
putchar(x%10+'0');
}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int qkw(int a,int k)
{
int ans=1,base=a;
while(k)
{
if(k&1) ans=ans*base%Q;
base=base*base%Q;
k>>=1;
}
return ans;
}
int C(int a,int b)
{
if(a<b) return 0;
return fac[a]*nf[b]%Q*nf[a-b]%Q;
}
void solve(int n,int k)
{
f[1][0]=1;
for(int i=1;i<=k+1;i++) s[i]=1;
for(int i=2;i<=n;i++)
{
for(int j=0;j<=min((i*(i-1))>>1,k);j++)
f[i][j]=((s[j+1]-s[max(j-min(i-1,j),0)])%Q+Q)%Q;
for(int j=0;j<=min(n*(n-1)>>1,k);j++)
{
s[j+1]=(s[j]+f[i][j])%Q;
if(j) f[i][j]=(f[i][j]+f[i][j-1])%Q;
}
}
}
int query(int n,int k)
{
int ans=0;
for(int i=1;i<=n;i++)
{
int kk=min(k,(i*(i-1))>>1),rs=C(n,i)*fac[n-i]%Q;
ans=(ans+rs*rs%Q*f[i][kk]%Q*(n-i+1)%Q)%Q;
}
return ans;
}
signed main()
{
fac[0]=nf[0]=1;
for(int i=1;i<=501;i++) fac[i]=fac[i-1]*i%Q;
nf[501]=qkw(fac[501],Q-2);
for(int i=500;i;i--) nf[i]=nf[i+1]*(i+1)%Q;
int T=fr(),maxn=0,maxk=0;
for(int i=1;i<=T;i++)
{
int n=fr(),k=fr();
maxn=max(maxn,n);
maxk=max(maxk,k);
q[i]={n,k};
}
solve(maxn,maxk);
for(int i=1;i<=T;i++) fw(query(q[i].first,q[i].second)),nl;
return 0;
}