求助 50pts WA
查看原帖
求助 50pts WA
749714
xyzfrozen楼主2023/4/7 16:38

求助 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;
}
2023/4/7 16:38
加载中...