ABC247F Cards Solution

更好的阅读体验戳此进入

题面

给定 n 张卡片,每张卡片正反面各有一个数,给定每张卡片正面和反面的数,保证正面的数构成的序列,和反面的数构成的,分别均为 1n 的排列,可以选择任意张卡片并获得其正反面的数,要求最终所有获得的数至少包含 1n 每个数至少一次。求有多少种取法,对 998244353 取模。

Solution

考虑卡片之间的联系,显然若一个数在同一张卡牌的正反面那么这张卡牌必须选择,否则无法凑齐一个排列,反之这个数一定会在两张卡牌中出现,且这两张卡牌一定至少有一张被选择,否则依然无法凑齐一个排列,这个很好理解。

于是我们考虑一些对于这种题的一般的套路,可以尝试建图,对于本题不难想到,我们将一张卡牌作为一个点,将这个点向卡牌上存在的数的另一次出现所在的卡牌连一条边。抽象地说,对于一个数所在的两张(或一张)卡牌位置 posi,0posi,1,其中一定有一个刚好为 i,我们就是要从 i 向不等于 i 的那个 posi 连一条边,这里便不难想到从 iposi,0posi,1i 连边即可。

不难想到这样会形成多个环,每一个环代表着其中几张卡牌,同时这些卡牌上的数在环内一定每个数都出现了两遍,如排列 {1,2,3} 和排列 {2,1,3},显然 i=1 时向数字 1 所在的另一张卡牌 2 和数字 2 所在的另一张卡牌 2 连边(不拿发现很有可能存在重边与自环,所以需要注意判重并忽略),对于 i=2 同理,最终一定会形成 12133 两个环,第一个环可以求出带有 1,2 数字的卡牌的让 1,2 都至少存在一次的卡牌选择方案数,第二个环则为 3 的方案数,将两者乘起来即为最终答案。并且环上每个边相连的两个点,或者说两张卡牌,至少要被选择一张,因为一条边连结的两个卡牌一定存在着相同的数,为了保证构成排列至少需要选择一个。

同时发现不同环的方案数,只跟环的长度有关,于是我们考虑令 dp(i) 表示 i 个数构成的环,则有边界 dp(1)=1dp(2)=3,和转移 dp(i)=dp(i1)+dp(i2),大概就是我们考虑向原环中插入第 i 个数,如果选择第 i 个数,那么任意的前 i1 个数的合法方案都可以接上新的这个数,反之如果不选第 i 个,那么第 i 个的两侧都应该是选择的,这个时候我们直观地可以想到,固定其左右的两个然后由 dp(i3) 转移而来,但是这个是有遗漏的。观察发现对于 i 不选择的,是存在类似 01i(0)10,也就是在固定三个之后左右各自接一个不选的,这个东西显然是不在 dp(i3) 里的,因为两个都不选接在一起形成环是不合法的,考虑如何正确地转移:我们可以考虑在 dp(i2) 的方案中找到任意一个选择的点,然后在其旁边接上 i 和另一个固定的选择的点,这样也是合法的且不重不漏,最终就是 dp(i)=dp(i1)+dp(i2)

于是考虑并查集维护好每个环的大小,dp(sizi) 即为最终的答案。

Code

UPD

update-2022_10_25 初稿