记录编号 549878 评测结果 A
题目名称 情侣?给我烧了 最终得分 100
用户昵称 Gravatar沉迷学习的假的Keller 是否通过 通过
代码语言 C++ 运行时间 0.079 s
提交时间 2020-02-25 21:41:16 内存使用 29.25 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=1000+10;
const long long mod=998244353;
long long c[maxn][maxn],fac[maxn],er[maxn],la[maxn],dp[maxn][maxn];

void dpk(){    //dp[i][j] 前i对情侣 j个座位只坐一个人时 合理的配对数(先不考虑座位) 
    dp[1][2]=1;
    la[0]=1;
	long long i,j;
    for(i=2;i<=1000;i++){
        for(j=0;j<=1000;j++){
         	if((i*2-j)&1){
			 	continue;
			}
         	dp[i][j]=(dp[i][j]+dp[i-1][j+2]*(j+2)*(j+1))%mod;   // 从j+2个单人座选两个坐 *C(j+2 2)
         	dp[i][j]=(dp[i][j]+dp[i-1][j]*j*2)%mod;             // 一个人做到单人座,另一个人新开一排 
         	if(j>=2)
			 	dp[i][j]=(dp[i][j]+dp[i-1][j-2])%mod;           //新开两排 
         	if(!j)
			 	la[i]=dp[i][j]*(fac[i])%mod*er[i]%mod; 
    	}
    }	
}
void pre(){
	fac[0]=1;er[0]=1;c[1][0]=1;c[1][1]=1;
	long long i,j;
	for(i=1;i<=1000;i++){
		fac[i]=fac[i-1]*i%mod;
	}
    for(i=1;i<=1000;i++){
		er[i]=er[i-1]*2%mod;
	}
	for(i=2;i<=1000;i++){
        c[i][0]=1;
        for(j=1;j<=i;j++){
			c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
		}
    }
    dpk();
	return ;
}

void keller(long long n){
	long long i;
	for(i=0;i<=n;i++){
		long long ans;
		ans=c[n][i]*c[n][i]%mod;
		ans=ans*fac[i]%mod;
    	ans=ans*er[i]%mod;
    	ans=ans*la[n-i]%mod;
    	printf("%lld\n",ans);
	}
	return ;
}

int main(){
	freopen("FFFqinglv.in","r",stdin);
	freopen("FFFqinglv.out","w",stdout);
	int T;
	scanf("%d",&T);
	pre();
	while(T--){
		long long x;scanf("%lld",&x);
		keller(x);
	}
	return 0;
}