TLE on #52 求卡常
查看原帖
TLE on #52 求卡常
681036
OldDriverTree楼主2024/3/31 16:37

rt,我机子上只需要 3s 就能跑出来啊

#include<bits/stdc++.h>
using namespace std;
const int N=2005,mod=998244353;
int n,m,ans,f[5][N][N>>2],g[N];
int fact[N],ifact[N];

int power(int a,int b)
{
	int ans=1;
	while (b) {
		if (b&1) ans=1ll*ans*a%mod;
		a=1ll*a*a%mod,b>>=1;
	}
	return ans;
}
void add(int &x,int y) {
	x+=y; if (x>=mod) x-=mod;
}
int main()
{
	scanf("%d%d",&n,&m),fact[0]=1;
	for (int i=1;i<=n<<2;i++) fact[i]=1ll*fact[i-1]*i%mod;
	ifact[n<<2]=power(fact[n<<2],mod-2);
	for (int i=n<<2;i;i--) ifact[i-1]=1ll*ifact[i]*i%mod;
	for (int i=0;i<=n;i++) f[1][i][i]=1ll*fact[n]*ifact[n-i]%mod;
	for (int c=1;c<4;c++) for (int num=0;num<=n*c;num++) for (int x=0;x<=num/c;x++)
	for (int i=0;i<=n;i++) add(f[c+1][num+i][min(x,i)],1ll*f[c][num][x]*fact[num+i]%mod*ifact[num]%mod*ifact[i]%mod*fact[n]%mod*ifact[n-i]%mod);
	for (int i=1;i<=n<<2;i++) for (int j=0;j<=n;j++) add(g[i],f[4][i][j]);
	ans=1ll*ifact[4]*fact[3]%mod;
	for (int i=2;i<=n<<2;i++) {
		int k=min(i-1,m),sum=0;
		for (int j=0;j<=k/4;j++) add(sum,1ll*f[4][k][j]*(n-j)%mod);
		add(ans,1ll*sum*power(g[k+1],mod-2)%mod);
	}
	printf("%d",ans);
	return 0;
}
2024/3/31 16:37
加载中...