正能量的dp——组合

A

\(\sum\limits_a f(a)=\sum\limits_k \#\{a|f(a)>k\}\)

然后发现或者已知两个结论:

  • \(\min\limits_{1\le i<j\le n}(a_i \oplus a_j)\)\(a\) 排序后相邻两个数异或和的最小值。考虑证明当 \(a<b<c\)\(\min(a\oplus b,b\oplus c)\le a\oplus c\)
  • \(f(a)=\min\limits_{1\le i<j\le n}(a_i \oplus a_j)\le \frac{2\max a_i}{n-1}\)。假设 \(f(a)\ge 2^k\),则其必要条件为 \(\lfloor\frac{a_i}{2^k} \rfloor\) 互不相同,所以可以得到 \(\max a_i\ge (n-1)2^k\),所以 \(2^k\le \frac{\max a_i}{n-1}\),所以 \(f(a)\le \frac{2\max a_i}{n-1}\)

假设 \(a\) 从大往小排序后的数组是 \(b\),其互不相同,容易得到 \(b\) 对应的 \(a\) 的数量应该是 \(\displaystyle \prod_{i=1}^{n}\left(c_{b_i}-i+1\right)\),这是方便计数的。

根据最开始的转换,只需要枚举 \(k\),并让 \(b\) 相邻两个数异或和 \(>k\) 即可。所以设 \(f_{i,j}\) 表示填了前 \(i\) 个数,\(b_i=j\) 对应的方案数。并且 \(k\) 的量级根据第二个结论是 \(O(\frac{V}{n})\) 的。转移比较显然,

\[f_{i,j}=(c_j-i+1)\sum_{x=j+1}^{V}[j\oplus x>k]f_{i-1,x} \]

直接做是 \(O(nV^2\cdot \frac{V}{n})=O(V^3)\)。考虑枚举 \(j\oplus x\)\(k\) 最高不相同的位 \(h\),则要求这一位 \(k\)\(0\)。然后设 \(j',x',k'\) 分别表示原数 \(/2^h\),那么 \(x'=(k'+1)\oplus j'\ne j'\),所以只需枚举 \(j'\) 便能算出 \(x'\),然后去掉 \(x'<j'\) 的情况。那么以后的位 \(x\) 是无限制的,相当于对于 \(j\in [j'2^h,(j'+1)2^h)\) 都加上 \(x\in [x'2^h,(x'+1)2^h)\)\(f_{i-1,x}\)。直接前缀和加差分即可。这层时间复杂度 \(O(\sum_{i=0}^{\log_2 V}2^i)=O(V)\)。所以总时间复杂度就是 \(O(V^2)\)

F

首先如果考虑按某种顺序将一个数跟前面或者后面的数进行匹配,其形态是不好确定的,也就是不好变成一个确定的子问题。所以考虑一次直接填完一个数。

先将模型变成统计有多少个 \(m\) 个二元组 \((x_i,y_i)\) 满足 \(x_i<y_i\)\(i\) 的出现次数为 \(b_i\)。然后按 \(i\) 从小到大填完,发现只关心当前填了 \(1\) 个和 \(0\) 个的二元组数量,并且知道一个便能推另一个。所以设 \(f_{i,j}\) 填了前 \(i\) 个某一二元组数量为 \(j\) 的方案数,转移枚举填几个在 \(0\),看似是 \(O(nV^2)\) 的,但是交换一下循环实际上是 \(O(nV)\) 的。

  • 按前后顺序不好做的话考虑按值域顺序

E

先思考 \(cnt^2\) 的组合意义,实际上就是选两条长为 \(l\) 的链的方案数。所以直接对着这个做。

假设确定了这两条链,那么其他点是没有限制的,然后这两条链上的点颜色要相同。即带一个 \(k^{n-|A\cup B|+1}\) 的系数。可以变成 \(k^{n-2l+1}\cdot k^{|A\cap B|}\),然后考虑直接记录两条链的长度和链尾,每次从拓扑序较小的点走一步,当走到同一个点的时候乘一下系数。

这样做是 \(O(n^3l^2)\) 的,并且不好优化。考虑容斥,直接枚举 \(|A\cap B|=c\)。钦定 \(c\) 个是好算的,相当于在拓扑序上 dp,设 \(f_{x,p,l_1,l_2}\) 表示现在钦定 \(x\) 为第 \(p\) 个重合的点,两条链的长度分别是 \(l_1,l_2\),转移相当于于枚举下一个重合的点和新的长度,需要提前预处理一个点到另一个点距离为 \(x\) 的路径数。这样时间复杂度是 \(O(n^3l+n^2l^5)\) 的。

然后这个显然可以是分步转移的,所以变成 \(O(n^2l^4)\),然后进一步优化比较 tricky。设 \(f(i)\)\(g(i)\) 分别表示恰好和钦定。有

\[\begin{aligned} f(i)&=\sum_{j=i}^{l}g(j)(-1)^{j-i}\binom{j}{i}\\ ans&=\sum_{i=0}^{l}f(i)k^{n-2l+1+i}\\ &=\sum_{i=0}^{l}k^{n-2l+1+i}\sum_{j=i}^{l}g(j)(-1)^{j-i}\binom{j}{i}\\ &=\sum_{j=0}^{l}g(j)k^{n-2l+1}\sum_{i=0}^{j}\binom{j}{i}k^{i}(-1)^{j-i}\\ &=k^{n-2l+1}\sum_{j=0}^{l}g(j)(k-1)^j \end{aligned} \]

相当于转移过程直接乘系数,不需要记录 \(p\) 的一维了。


  • 平方的组合意义

  • 二项式反演外层带 \(a^i\) 都可以考虑乘进去

D

首先观察权值的定义式,发现跟 \(|S|\) 强相关,于是不妨枚举 \(|S|\)。那么就可以直接 \(O(n^2)\) 树形背包算贡献了。

但是这没有用到模数的性质,思考一下 \(U^V\) 的意义。由于它的权值是乘积,把括号拆开,如果选了不少于 \(V\) 个被 \(U\) 整除的数,那么这一项的贡献显然为 \(0\)。所以考虑将 \(|S|\) 拆为 \(Uk+r\),那么权值形式就是 \(\prod (Uk+(r+a))\)。于是只需在 dp 的时候记录一下选取 \(Uk\) 的次数,那么这个次数是 \(<V\) 的。然后最后枚举一下 \(x\)\(y\) 计算一下答案即可。所以时间复杂度是 \(O(n^2 UV^2)\)

  • 注意特殊的模数
posted @ 2025-12-16 14:39  _chara  阅读(28)  评论(0)    收藏  举报
Title