ACL Beginner Contest F(Heights and Pairs)题解——分治NTT

Description

一个序列有 2 n 2n 2n个数,现在你要在这个序列中配得 n n n个无序数对,使得每一对的两个数不同且每个数都在恰好 1 1 1个对中。

请求出合法配对的方案数。注意 ( 1 , 3 ) ( 2 , 4 ) (1,3)(2,4) (1,3)(2,4)与 ( 2 , 4 ) ( 1 , 3 ) (2,4)(1,3) (2,4)(1,3)这两种配对方式是等价的。

请将答案对 998244353 998244353 998244353取模

n ≤ 50000 , a i ≤ 1 0 5 n≤50000,a_i≤10^5 n≤50000,ai​≤105

Solution

考虑 d p dp dp。

如果按照整个序列去进行 d p dp dp的话很难设计出合理的状态,所以考虑开桶 d p dp dp,并令 v i v_i vi​表示第 i i i个桶的大小。根据题意,每一个桶中的数不能进行匹配,不难得到状态设计与状态转移:

d p i , j dp_{i,j} dpi,j​表示看到第 i i i个桶(即已经处理了 1 1 1至 i i i号桶),还剩 j j j个未匹配的方案数

状态转移如下:
d p i , j = ∑ k = 0 v i   C v i k   A j − ( v i − k ) + k k   d p i − 1 , j − ( v i − k ) + k dp_{i,j}=\sum_{k=0}^{v_i}\ C_{v_i}^k\ A_{j-(v_i-k)+k}^k\ dp_{i-1,j-(v_i-k)+k} dpi,j​=∑k=0vi​​ Cvi​k​ Aj−(vi​−k)+kk​ dpi−1,j−(vi​−k)+k​

解释一下这个状态转移。 k k k枚举的是在 i i i这个桶内与前面匹配掉的数的数量。 C v i k C_{v_i}^k Cvi​k​表示在第 i i i个桶中选择 k k k个与前面进行匹配。由于看到第 i i i个桶还剩 j j j个数未匹配,第 i i i个桶本身对“未匹配的量”的贡献是 v i − k v_i-k vi​−k,并且前面还要多留 k k k个数与第 i i i个桶选中的数进行匹配,所以之前未匹配的数的数量应该是 j − ( v i − k ) + k j-(v_i-k)+k j−(vi​−k)+k。在这个里面选 k k k个数与第 i i i个桶中选定的 k k k进行匹配的方案数为 A j − ( v i − k ) + k k A_{j-(v_i-k)+k}^k Aj−(vi​−k)+kk​。

每次暴力转移的时间复杂度是 O ( n 3 ) O(n^3) O(n3)的,严重超时。我们先尝试将它优化到 O ( n 2 ) O(n^2) O(n2)或类 O ( n 2 ) O(n^2) O(n2)。

我们拆开状态转移式中的括号并观察:

d p i , j = ∑ k = 0 v i   C v i k   A j − ( v i − k ) + k   d p i − 1 , j − ( v i − k ) + k dp_{i,j}=\sum_{k=0}^{v_i}\ C_{v_i}^k\ A_{j-(v_i-k)+k}\ dp_{i-1,j-(v_i-k)+k} dpi,j​=∑k=0vi​​ Cvi​k​ Aj−(vi​−k)+k​ dpi−1,j−(vi​−k)+k​

d p i , j = ∑ k = 0 v i   C v i k   A j − v i + 2 k   d p i − 1 , j − v i + 2 k dp_{i,j}=\sum_{k=0}^{v_i}\ C_{v_i}^k\ A_{j-v_i+2k}\ dp_{i-1,j-v_i+2k} dpi,j​=∑k=0vi​​ Cvi​k​ Aj−vi​+2k​ dpi−1,j−vi​+2k​

考虑将 d p i − 1 dp_{i-1} dpi−1​翻转,就得到了一个卷积的形式。每次跑一遍 N T T NTT NTT,时间复杂度优化到 O ( n 2 log ⁡ n ) O(n^2 \log n) O(n2logn)。

但是我们依然不满意。不难发现这个状态转移可以用cdq分治来优化,即分治NTT。每次我们递归左半边,跑一遍NTT处理左半边对右半边的贡献再往后边递归。由于递归的深度最大是 log ⁡ n \log n logn的,所以卷积的次数为 n log ⁡ n n \log n nlogn次,总时间复杂度为 O ( n log ⁡ 2 n ) O(n \log^2 n) O(nlog2n)。

NTT txdy!

Summary

在本题中,我们巧妙设计了 d p dp dp状态,发现翻转后是一个卷积的形式,从而采用分治NTT将时间复杂度优化到了 O ( n 2 log ⁡ n ) O(n^2 \log n) O(n2logn)。

可以说这是一道比较套路的题,唯一较为灵活的就是 d p dp dp的状态设计以及状态转移。分治NTT出来得比较自然,可惜蒟蒻(我)在想这题的时候并不会分治NTT,是在看了别人的题解之后才悟懂。

感觉这题放在ABC的F题是不是太过分了啊???

上一篇:CF1096G Lucky Tickets


下一篇:日本已开始提供10Gbps万兆光纤接入服务