LG4931 情侣?给我烧了!

Posted autoint

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LG4931 情侣?给我烧了!相关的知识,希望对你有一定的参考价值。

情侣?给我烧了!

(n) 对情侣来到电影院观看电影。在电影院,恰好留有 (n) 排座位,每排包含 (2) 个座位,共 (2×n) 个座位。 现在,每个人将会随机坐在某一个位置上,且恰好将这 (2 × n) 个座位坐满。 如果一对情侣坐在了同一排的座位上,那么我们称这对情侣是和睦的。 你的任务是求出当 (k = 0, 1, ... , n) 时,共有多少种不同的就坐方案满足恰好(k) 对情侣是和睦的。 两种就坐方案不同当且仅当存在一个人在两种方案中坐在了不同的位置。不难发现,一共会有 ((2n)!) 种不同的就坐方案。 由于结果可能较大,因此输出对 (998244353) 取模的结果。

对于 (100 \%) 的数据,满足 (1 leq T leq 2 imes 10^5, 1 leq n leq 5 imes 10^6, 0 leq k leq n)

生成函数做法

https://www.luogu.com.cn/blog/EntropyIncreaser/solution-p4931

给出一个生成函数爆算递推式的方式:

不妨设 (D_n) 是这个问题的“错排”:每对情侣都不在一排的方案数。那么对于答案 (f(n, k)) 来说就可以用 (D_n) 进行表示,即考虑坐在一排的情侣是哪几对且他们在哪几排,即

[ f(n,k) = inom nk^2 D_{n-k} k!2^k ]

因为 (sum_{k=0}^n f(n,k)=(2n)!),所以有恒等式

[ sum_{k=0}^n inom nk^2 D_{n-k}k!2^k = (2n)! ]

其中 (inom nk^2) 引导我们将生成函数写成

[ f(x) = sum_{n=0}^infty frac{a_n}{n!^2} x^n ]

那么因为

[ sum_{n=0}^infty frac{n!2^n}{n!^2} x^n = mathrm{e}^{2x}\sum_{n=0}^infty frac{(2n)!}{n!^2}x^n = frac1{sqrt{1-4x}} ]

这个 (frac{(2n)!}{n!^2}) 类似卡特兰数推导过程的中间量。尝试手动展开 (frac{1}{sqrt{1-4x}})

[ [x^n]frac{1}{sqrt{1-4x}}=inom{-1/2}{n}(-4)^n=frac{prod_{i=0}^{n-1}(-1/2-i)}{n!}(-4)^n=frac{(2n-1)!!}{n!}2^n=frac{(2n-1)!!}{n!}frac{(2n)!!}{n!}=frac{(2n)!}{n!n!} ]

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

[ D(x) cdot mathrm e^{2x} = frac1{sqrt{1-4x}} ]

因此

[ D(x) = frac{mathrm e^{-2x}}{(1-4x)^{1/2}} ]

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

[ D_n = sum_{k=0}^n inom nk^2 (-2)^kk! (2n - 2k)! ]

或者也可以直接卷积,但是这都不够快速。我们考虑对 (D(x)) 进行求导。

[ D'(x) = frac{8xcdot mathrm e^{-2x}}{(1-4x)^{3/2}} = frac{8x}{1-4x} D(x) ]

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

[ (1-4x)D'(x)=8xD(x)D'(x) = 4xD'(x) + 8xD(x) ]

提取系数有

[ frac{D_{n+1}}{n!(n+1)!} = 4frac{D_n}{n!(n-1)!} + 8frac{D_{n - 1}}{(n-1)!^2}D_{n+1} = 4n(n+1)D_n + 8n^2(n+1)D_{n - 1} ]

组合做法

https://www.luogu.com.cn/blog/Linnewww/solution-p4931

模仿标准错排数的推导过程,我们来推导情侣错排数。

先考虑第一排放什么。

  1. 放一对基佬,方案数 (inom{n}{2}2=n(n-1))

  2. 放一对妹子,同上。

  3. 放不是情侣的一男一女,方案数 (inom{n}{2}2cdot 2=2n(n-1))

然后考虑剩下的位置,显然关键点在于第一排放的人的配偶。

  1. 坐在一起。那么共有 (2(n-1)D_{n-2}) 种方案。

  2. 不坐在一起,相当于一对情侣的限制。那么共有 (D_{n-1}) 种方案。

综上所述,(D_n=4n(n-1)(D_{n-1}+2(n-1)D_{n-2}))

CO int N=5e6+10;
int fac[N],ifac[N],bas[N],D[N];

IN int binom(int n,int m){
    return mul(fac[n],mul(ifac[m],ifac[n-m]));
}
int main(){
    fac[0]=1;
    for(int i=1;i<N;++i) fac[i]=mul(fac[i-1],i);
    ifac[N-1]=fpow(fac[N-1],mod-2);
    for(int i=N-2;i>=0;--i) ifac[i]=mul(ifac[i+1],i+1);
    bas[0]=1;
    for(int i=1;i<N;++i) bas[i]=add(bas[i-1],bas[i-1]);
    D[0]=1,D[1]=0;
    for(int i=2;i<N;++i){
        D[i]=add(D[i-1],mul(2*(i-1),D[i-2]));
        D[i]=mul(D[i],mul(4*i,i-1));
    }
    for(int T=read<int>();T--;){
        int n=read<int>(),k=read<int>();
        int ans=mul(binom(n,k),mul(binom(n,k),fac[k]));
        ans=mul(ans,mul(bas[k],D[n-k]));
        printf("%d
",ans);
    }
    return 0;
}

以上是关于LG4931 情侣?给我烧了!的主要内容,如果未能解决你的问题,请参考以下文章

Luogu4921/4931 情侣?给我烧了! 组合递推

luogu P4931 情侣?给我烧了!

[Luogu4921]情侣?给我烧了![错位排列]

2019-9-11做题记录

我烧了50万RMB,换来3条社群运营经验,今天全部拿出来!

20190922