加载中...

CF edu 181 E(思维+后缀背包trick)

E

简述下题意:一个不可重集 \(Q\),需满足:

  • \(|Q| =\) \(n\)
  • \(Q_{i} \in [1, x]\)
  • 可以由非空的且 \(\forall a_{i}\geq1\) 的数组 \(a\) 经过如下方式得到:令 \(s = \sum a_{i}\),则 \(Q = \{s-a_{i}\}_{i=1}^{n}\) 去重后的集合。

对这样的集合 \(Q\) 计数。

直接对 \(Q\) 计数必然不好做,因此想办法将问题转化成与其形成 \(1-1\) 映射,且性质优良的序列计数

考虑满足以下性质的数组 \(a\)最小值一定是1,且里面只有1可重复,其他元素均不能重复

现在证明:\(\forall\) 合法的 \(Q\),均可以对应唯一一个这样的数组 \(a\)

  1. 先证明存在性(即可以映射到满足上述性质的 \(a\)):

    首先,对 \(\forall\) 合法的 \(Q\),一定会对应某个序列 \(b\),可以形成 \(Q\)。对序列 \(b\) 做如下操作:

    • \(b\) 内每个元素减掉 \(min(b) - 1\)(使得最小值一定为1),形成 \(b'\)
    • 由于每个元素减掉的是相同的量,因此不难证明 \(b'\) 对应的集合 \(Q'\)\(Q\) 中每个元素的差值相同。
    • 由于添加重复元素 \(val\) 只会使得 \(Q'\) 中的每个值加 \(val\),而有 \(1 \in b'\),因此一定可以通过添加若干个1,使得 \(Q'\) 中每个元素增加相同的值,进而将 \(Q'\) 转化为 \(Q\)
    • 最后,对于 \(b'\) 中其他 \(>1\) 且重复的元素,可以将重复的部分转化为若干个1,显然这样不会改变 \(Q'\)

    至此,对于 \(\forall Q\),我们便构造了满足上述性质的序列 \(b'\),存在性证毕。

  2. 再证明唯一性(即证明不会存在两个不同的 \(a\),对应同一个 \(Q\),即证明 \(1-1\) 映射):

    • 在首元素固定相同的情况下,对于任意两个不同的序列,差分数组一定不同。由于每个序列必然含首元素1,两个不同的 \(a\) 的差分数组不同,形成的集合 \(Q\) 的差分数组也一定不同,因此 \(Q\) 也一定不同。 唯一性证毕。

因此,我们便可将问题转化为对满足上述性质的数组 \(a\) 计数。

现在总结一下数组 \(a\) 需满足的所有性质(钦定 \(a\) 升序):

  • \(a_{1} = 1\)
  • 只有1可重复,其他元素不可重复
  • \(max(Q) = (\sum a_{i}) - 1 \leq x\) \(\Rightarrow\) \(\sum a_{i} \leq x + 1\)
  • 恰好有 \(n\) 种不同的数

由于 \(a\) 中一定含有至少一个1,先将这个 \(1\) 刨去,转化为 \(\sum a_{i} \leq x\);而对于其他的 \(1\) 是可有可无的,故可以先对其他的 \(a_{i} > 1\) 先求方案数,最后再考虑添加重复的1。

而对于 \(\forall a_{i} > 1\) 只能出现一次,相当于 \(a_{i} < a_{i + 1}\)。可以将 \(a_{i}\) 看作选择第 \(i\) 个物品的数量,这便类似于:若干个物品,其中第 \(i\) 个物品选取的个数必须严格少于\(i + 1\) 个物品选取的个数。可以用后缀背包这个技巧来解决:后缀背包

对除 \(a_{i} = 1\) 的其他 \(a_{i}\) 跑后缀背包,求出 \(dp[V]:\) 总和恰好为 \(V\) 的方案数。那么总方案数 \(ans\) 为:

\[ans = \sum_{i=0}^{V}dp[i]*(V-i+1) \]

其中 \((V-i+1)\) 的含义:其他 \(>1\) 的数选取总和为 \(i\),而要求总和 \(\leq V\),并且1是可重复选的。则相当于可以选择 \(0 \backsim V - i\) 个1。故对每一项还需要乘个系数。

具体细节见代码。

code

posted @ 2025-07-24 21:27  jxs123  阅读(7)  评论(0)    收藏  举报