EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

P4931 [MtOI2018] 情侣?给我烧了!(加强版)

题目背景

本题原版:P4921

题目描述

n 对情侣来到电影院观看电影。在电影院,恰好留有 n 排座位,每排包含 2 个座位,共 2n 个座位。

现在,每个人将会随机坐在某一个位置上,且恰好将这 2n 个座位坐满。

如果一对情侣坐在了同一排的座位上,那么我们称这对情侣是和睦的。

你的任务是求出共有多少种不同的就坐方案满足恰好k 对情侣是和睦的。

两种就坐方案不同当且仅当存在一个人在两种方案中坐在了不同的位置。不难发现,一共会有 (2n)! 种不同的就坐方案。

由于结果可能较大,因此输出对 998244353 取模的结果。

输入格式

输入包含多组数据。

输入的第 1 行包含 1 个正整数 T,表示数据的组数。

接下来 T 行,每行包含 2 个正整数 n,k

输出格式

输出共 T 行。

对于每组输入数据,输出共 1 行,包含 1 个整数,表示恰好有 k 对情侣和睦的就坐方案数。

输入输出样例 #1

输入 #1

1
2
3
4
5
6
5
1 1
2 0
2 2
2333 666
2333333 1000000

输出 #1

1
2
3
4
5
2
16
8
798775522
300377435

子任务

对于 10% 的数据,满足 1T10,1n5

对于 40% 的数据,满足 1n3×103

对于 100% 的数据,满足 1T2×105,1n5×106,0kn

题解

dnn 对情侣中每对情侣都不在同一排的配对方案数(不是组合数学中的错排)。那么对于答案 f(n,k) 有:

f(n,k)=(Cnk)2k!2kdnk

这自然而然地导出了恒等式

k=0nf(n,k)=k=0n(Cnk)2k!2kdnk=k=0nn!22kdnkk!(nk)!2=(2n)!

进而有

k=0n2kk!dnk(nk)!2=(2n)!n!2

发现等号左侧恰好是一个系数卷积的形式,于是有:

k=0n2kk!dnk(nk)!2xn=(2n)!n!2xn

定义

D(x)=n=0+dnn!2xn

我们知道

n=02nn!xn=e2x,n=0(2n)!n!2xn=114x

带入原始式,我们得到了生成函数 D(x) 的方程

e2xD(x)=114x

因此

D(x)=e2x14x

这帮助我们得到一个式子用于计算 dn(其实就是容斥)

dn=n!2k=0n(2)kk!(2n2k)!(nk)!2=k=0n(Cnk)2(2)kk!(2n2k)!

至此,我们得到了 O(n2) 的组合数学算法或者 O(nlogn) 的卷积算法,但是这都不够快速。

我们考虑对 D(x) 进行求导。

D(x)=8xe2x(14x)3/2=8x14xD(x)

这个微分方程可以帮助我们写出 D(x) 的递推形式了,即

D(x)=4xD(x)+8xD(x)

在生成函数上的开放形式运算,对于 D(x),我们有:

D(x)=n=1+ndnn!2xn1

代入 D(x)D(x) 的开放形式,令等式左右两边关于 xn 的系数相等,有

dn+1=4n(n+1)dn+8n2(n+1)dn1

于是我们得到了线性的递推方程。