LG4931 情侣?给我烧了!

情侣?给我烧了!

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

对于 \(100 \%\) 的数据,满足 \(1 \leq T \leq 2 \times 10^5, 1 \leq n \leq 5 \times 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) = \binom nk^2 D_{n-k} k!2^k
\]

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

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

其中 \(\binom 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}}=\binom{-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 \binom nk^2 (-2)^kk! (2n - 2k)!
\]

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

\[
D'(x) = \frac{8x\cdot \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)!} = 4\frac{D_n}{n!(n-1)!} + 8\frac{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. 放一对基佬,方案数 \(\binom{n}{2}2=n(n-1)\)。
  2. 放一对妹子,同上。
  3. 放不是情侣的一男一女,方案数 \(\binom{n}{2}2\cdot 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\n",ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/autoint/p/12186091.html

时间: 2024-07-31 18:12:05

LG4931 情侣?给我烧了!的相关文章

HXY烧情侣(洛谷 2194)

题目描述 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里有n座电影院,n对情侣分别在每座电影院里,然后电影院里都有汽油,但是要使用它需要一定的费用.m条单向通道连接相邻的两对情侣所在电影院.然后HXY有个绝技,如果她能从一个点开始烧,最后回到这个点,那么烧这条回路上的情侣的费用只需要该点的汽油费即可.并且每对情侣只需烧一遍,电影院可以重复去.然后她想花尽可能少的费用烧掉所有的情侣.问最少需要多少费用,并且当费用最少时的方案

洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码

洛谷 P2194 HXY烧情侣[Tarjan缩点] 分析+题解代码 题目描述: 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里有n座电影院,n对情侣分别在每座电影院里,然后电影院里都有汽油,但是要使用它需要一定的费用.m条单向通道连接相邻的两对情侣所在电影院.然后HXY有个绝技,如果她能从一个点开始烧,最后回到这个点,那么烧这条回路上的情侣的费用只需要该点的汽油费即可.并且每对情侣只需烧一遍,电影院可以重复去.然后她想花尽

HXY烧情侣

题目描述 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里有n座电影院,n对情侣分别在每座电影院里,然后电影院里都有汽油,但是要使用它需要一定的费用.m条单向通道连接相邻的两对情侣所在电影院.然后HXY有个绝技,如果她能从一个点开始烧,最后回到这个点,那么烧这条回路上的情侣的费用只需要该点的汽油费即可.并且每对情侣只需烧一遍,电影院可以重复去.然后她想花尽可能少的费用烧掉所有的情侣.问最少需要多少费用,并且当费用最少时的方案

洛谷 P2194 HXY烧情侣

P2194 HXY烧情侣 裸tarjan 1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 #define LL long long 9 #define maxn 1000000 10 #define

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

题意 题意很清楚 \滑稽 分析 对于每一个询问 \(k\) ,记 \(g(x)\) 表示 \(x\) 对情侣都错开的方案总数,那么答案可以写成如下形式: \[ {ans}_k= \binom{n}{k}\times A_n^k\times 2^k\times g(n-k) \] 考虑如何求 \(g(x)\) (一个错位排列). 考虑第一排,一共有三种情况:两男两女或者一男一女(不配对). 两男:顺次选出两男的方案数为 \(x(x-1)\) ,然后考虑他们的配偶在之后的配对情况: 如果强制不配对,

luogu4931.情侣?给我烧了!(加强版)(错位排列)

题目链接 https://www.luogu.org/problemnew/show/P4931 题解 以下部分是我最开始的想法. 对于每一个 \(k\),满足恰好有 \(k\) 对情侣和睦的方案数为 \[\binom{n}{k} × \binom{n}{k} × k! × 2^k × f_{n - k}\] 其中,\(f_x\) 表示 \(x\) 对情侣坐 \(x\) 排座位且没有任何一对情侣坐在同一排的方案数. 上述式子的意义为:从 \(n\) 对情侣中选出 \(k\) 对作为和睦的,再从

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

4921 4931 第一眼看着就像容斥,但是容斥不怎么好做-- 第二眼想到错排,结果错排公式糊上去错了-- 不难考虑到可以先选\(K\)对情侣坐在一起,剩下\(N-K\)对错排 选\(K\)对情侣坐在一起的方案数是: 选情侣的方案数\(C_N^K \times\)选椅子的方案数\(C_N^K\times\)情侣坐的椅子可以任意排列\(K!\times\)情侣之间可以互换位置\(2^K\)=\((C_N^K)^2K!2^K\) 然后考虑这个错排 实际上直接糊错排公式是很难对的,至少我不会直接用错排

【luogu P2194 HXY烧情侣】 题解

题目链接:https://www.luogu.org/problemnew/show/P2194 第一问:缩点并且统计其强连通分量里的最小耗费.把所有强连通分量的最小耗费加起来. 第二问:统计在每个强连通分量里与最小耗费相同的点数.乘法原理统计所有强连通分量答案. #include <stack> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm&g

luogu P4931 情侣?给我烧了!

双倍经验 传送门 首先坐在一起的cp和不坐在一起的cp是相对独立的,可以分开考虑,然后方案数相乘 坐在一起的cp,方案为\(\binom{n}{k}*\binom{n}{k}*k!*2^k\).首先选出k排座位,然后选出k对cp坐下,然后这k对可以任意打乱顺序,并且每一对可以换座位 不坐在一起的cp,一开始以为就是个错排,然后错排其实是没考虑一对cp坐在同一列的情况的.考虑递推,设\(f[i]\)表示i个不坐在一起的cp的方案.首先可以选出两个不是一对cp的人,方案为\(2i*(2i-2)\),