题目描述
有 n 对情侣来到电影院观看电影。在电影院,恰好留有 n 排座位,每排包含 2 个座位,共 2×n 个座位。
现在,每个人将会随机坐在某一个位置上,且恰好将这 (2 × n) 个座位坐满。
如果一对情侣坐在了同一排的座位上,那么我们称这对情侣是和睦的。
你的任务是求出当 (k = 0, 1, ... , n) 时,共有多少种不同的就坐方案满足恰好有 k 对情侣是和睦的。
两种就坐方案不同当且仅当存在一个人在两种方案中坐在了不同的位置。不难发现,一共会有 ((2n)!) 种不同的就坐方案。
输入输出格式
输入格式:
输入包含多组数据。
输入的第一行包含一个正整数 (T(1 leq T leq 1000)),表示数据的组数。
接下来 TT 行,每行包含一个正整数 (n(1 leq n leq 1000))。
输出格式:
对于每组输入数据,输出共 n + 1 行,每行包含 1 个整数,分别表示 (k = 0, 1, ..., n) 时满足恰好有 k 对情侣是和睦的就坐方案数。由于结果可能较大,因此输出对 (998244353) 取模的结果。
输入输出样例
输入样例#1: 复制
2
1
2
输出样例#1: 复制
0
2
16
0
8
说明
本题只有一个T=1000的数据点。。。暴力还是算了吧!
公式
[ans_n^k=2^n imes n! imes C_n^k imes D_{n-k}
]
然而这个D并不是错排...因为它并不是信只能对应信封的关系...
公式:
[D_i=D_{i-2} imes (i-1) imes 2+(2 imes C_{2*i-2}^2-i+1)*(D_{i-1}+D_{i-2})
]
...
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define max(a,b) ((a)>(b) ? (a): (b))
#define min(a,b) ((a)<(b) ? (a): (b))
#define LL long long
#define M 998244353
using namespace std;
LL i,m,n,j,k,a[1001],b[1010],c[2001][2001],d[1001],t,f[1001];
int main()
{
c[0][0]=b[0]=f[2]=f[1]=a[0]=d[0]=1; d[2]=2;
for(i=1;i<=1000;i++)
{
c[i][0]=c[i][i]=1;
for(j=1;j<=i;j++) c[i][j]=(c[i-1][j]+c[i-1][j-1])%M;
}
for(i=3;i<=1000;i++)
{
d[i]=((d[i-2]*(i-1)*2)%M+2*((2*i-2)*(2*i-3)/2%M-i+1)%M*f[i-1]%M)%M;
f[i]=d[i-2]+d[i-1]%M;
}
for(i=1;i<=1001;i++) b[i]=b[i-1]*2%M;
for(i=1;i<=1001;i++) a[i]=a[i-1]*i%M;
scanf("%lld",&t);
for(;t;t--)
{
scanf("%lld",&n);
for(i=0;i<=n;i++) printf("%lld
",b[n]*a[n]%M*c[n][i]%M*d[n-i]%M);
}
}
Update 12/23/2018
(ZUTTER)企图复习一下以前做的题来着,然后发现上面那个柿子画的好丑啊QAQ
其实$$D_i=(D_{i-2}+D_{i-1}) imes (i-1) imes 2$$
QAQ
这样就是sb题了啊,只有两种情况
被自己菜死了怎么办啊QAQ