提交时间:2023-12-20 11:20:17

运行 ID: 24239

#include<bits/stdc++.h> using namespace std; #define it int #define int long long const int MAXN=510,N=125010,Mod=1000000007; int t,n,e; it g[MAXN][N]; int jc[MAXN],ny[MAXN]; int Pow(int x,int y){ int rt=1; while(y){ if(y&1)rt=rt*x%Mod; x=x*x%Mod;y>>=1; } return rt; } int C(int x,int y){ if(x==y||y==0||x==0)return 1; // cout<<x<<" "<<y<<" "<<x-y<<" "<<jc[x]<<" "<<ny[y]<<" "<<ny[x-y]<<endl; return jc[x]*ny[y]%Mod*ny[x-y]%Mod; } signed main(){ jc[0]=1;ny[0]=1; for(int i=1;i<=500;i++){jc[i]=jc[i-1]*i%Mod;ny[i]=Pow(jc[i],Mod-2);} g[1][0]=1; for(int i=1;i<=500;i++){ int f=0; //cout<<i<<":"<<endl; for(int j=0;j<=i*(i-1)/2;j++){ f=(f+g[i][j]+Mod)%Mod; g[i+1][j]=(g[i+1][j]+f)%Mod;g[i+1][j+i+1]=(g[i+1][j+i+1]-f+Mod)%Mod; //cout<<g[i][j]<<" "; } //cout<<endl; } //cout<<endl; for(int i=1;i<=500;i++){ for(int j=1;j<=i*(i-1)/2;j++){ g[i][j]=(g[i][j]+g[i][j-1])%Mod; } g[i][i*(i-1)/2+1]=0; } for(int i=1;i<=500;i++){ //cout<<g[i][0]<<" "; for(int j=1;j<=i*(i-1)/2;j++){ g[i][j]=(g[i][j]+g[i][j-1])%Mod; //cout<<g[i][j]<<" "; } g[i][i*(i-1)/2+1]=0; //cout<<endl; } scanf("%lld",&t); while(t--){ scanf("%lld%lld",&n,&e); int ans=0; for(int i=1;i<=n;i++){ int ei=min(i*(i-1)/2,e); ans+=(n-i+1)%Mod*g[i][ei]%Mod*C(n,i)%Mod*C(n,i)%Mod*jc[n-i]%Mod*jc[n-i]%Mod; //cout<<i<<":"<<(n-i+1)<<" g["<<i<<"]["<<ei<<"]:"<<g[i][ei]<<" "<<C(n,i)<<" "<<jc[n-i]<<endl; ans%=Mod; } printf("%lld\n",ans); } return 0; }