题解:CF1605F PalindORme

看了 n 年才发现自己读错题了。

题意:很简单了,不再赘述。

做法:

一般来说给了一个定义就先手玩一下感受一下,我们从 \(i=1\) 开始手玩:

\[a_1 = a_n \]

\[a_1|a_2 = a_{n-1}|a_n \]

我们先考虑相邻的这两个限制,会发现一个事情,对于 \(a_{n-1}\)\(a_2\),他们会多出来的位一定是相同的,对于其他的讨论同样有此结论。

那么我们就可以给出来一个合法序列的充要条件,假设我们目前序列中已有的数或值为 \(V\),那么要求能选出两个数 \(x,y\),满足 \(V|x = V|y\),然后把他们加入集合中。

有了这个条件我们再考虑计数,直接计数好像并不太容易,注意到不能继续操作的时候肯定是除去 \(V\) 中位的时候剩余的数各不相同,这个看起来很容易计数,我们考虑计数不能的方案再减去。

首先我们计算总的方案数,记 \(f_{i,j}\) 代表序列长为 \(i\),二进制位恰好有 \(j\) 位时的总序列数,那么直接容斥 \(j\),可以得到转移式:

\[f_{i,j} = \sum_{k=0}^j(-1)^{j-k}C_{j}^k(2^k)^i \]

然后我们考虑用 \(g_{i,j}\) 代表序列长为 \(i\),二进制位恰有 \(j\) 位时不合法序列数,这里我们考虑直接枚举到什么时候我们无法操作了,有转移式:

\[g_{i,j} = \sum_{x = 0}^{i-1}\sum_{y=0}^{j-1} (f_{x, y} - g_{x,y})\times (2^y) ^ {i-x}C_{i}^xC_j^y \times [长为 i-x,用了恰好 j-y 个位的序列数量] \]

解释一下,\(f_{x,y}-g_{x,y}\) 是枚举的合法序列数量,\((2^y)^i\) 是因为我这剩下的 \(i-x\) 个数在这 \(y\) 位中可以随意选择,组合数就是选出来的方案数。

那么看到上面还有一个东西要求,我们可以再设一个,\(h_{i,j}\) 代表序列长为 \(i\),二进制位恰有 \(j\) 位时,所有数全都不同且没有 \(0\) 有多少种方案,还是对 \(j\) 容斥得到式子:

\[h_{i,j} = \sum_{k=0}^j(-1)^{j-k}C_j^k(2^k-1)^{\underline{i}} \]

注意我们这里特别强调了没有 \(0\),因为如果我们前面填了 \(0\),但是我们在这个不能操作的序列中也有 0,这样就重复了,所以我们这里不能让他有 \(0\)

注意到一个事情,如果说是奇数的 \(n\),那么显然最后的时候我们其实是可以填一个 \(0\) 上去的,所以注意转移 \(g\) 的时候此时不能转移。

复杂度 \(O(n^2k^2)\)

posted @ 2025-07-23 23:37  LUlululu1616  阅读(6)  评论(0)    收藏  举报