loading

一类 dp 计数题

CF2125E Sets of Complementary Sums

考虑到集合 \(Q\) 没啥特殊性质,考虑对 \(a\) 计数。

首先发现重复元素存在的意义就是让 \(Q\) 内元素全体加该元素的值,那么我们将这个重复的元素替换成元素值个 1,就转化成了除了 1 以外其他数都只出现一次的情况。

我们再将 \(a\) 进一步简化,发现若 \(Q\) 的最小值为 \(c\),那么让 \(a\) 全体减 \(c-1\) 再加上 \((n-1)(c-1)\) 个 1 即可,这样每个元素减少了 \(c-1\)\(s\) 也减少了 \(c-1\),那么 \(Q\) 不变,转化成了至少一个 1 和若干个其他不重复的元素。

那对这个序列计数会算错吗?首先肯定不会算漏,其次若存在两个 \(a\) 生成的 \(Q\) 相同,那么首先由于 \(\max Q=s-1\),所以两者 \(s\) 相等,再因 \(Q\) 次大值为 \(s-a 的次小值\) 那么两者的次小值也相等(最小值必须是 1 所以必然相等),以此类推两者完全相同,所以不会算重。

\(a\) 计数就简单多了。由于 \(\max Q=s-1\le x\),那么 \(s\le x+1\),由于 \(a\) 没有重复元素(先钦定 1 只出现一次然后之后随便加就行),所以 \(a\) 的长度是 \(O(\sqrt x)\) 级别的。类似拆分数的,设 \(f_{i,j}\) 表示 \(len=i,s=j\),转移可以先全体加 1 再添一个 1,也可以只全体加 1。为了钦定最小值是 1,我们可以保留最后一次全体加 1 再添 1 的步骤,用 dp 算前面的步骤就行。转移 \(f_{i,j}=f_{i-1,j-i}+f_{i,j-i}\),答案是 \(\sum_{x'\le x+1-n} (x-x'-n+2)f_{n-1,x'}\)

时间复杂度 \(O(x\sqrt x)\)

posted @ 2025-12-01 09:30  dcytrl  阅读(2)  评论(0)    收藏  举报