题解:CF1605F PalindORme
看了 n 年才发现自己读错题了。
题意:很简单了,不再赘述。
做法:
一般来说给了一个定义就先手玩一下感受一下,我们从 \(i=1\) 开始手玩:
我们先考虑相邻的这两个限制,会发现一个事情,对于 \(a_{n-1}\) 和 \(a_2\),他们会多出来的位一定是相同的,对于其他的讨论同样有此结论。
那么我们就可以给出来一个合法序列的充要条件,假设我们目前序列中已有的数或值为 \(V\),那么要求能选出两个数 \(x,y\),满足 \(V|x = V|y\),然后把他们加入集合中。
有了这个条件我们再考虑计数,直接计数好像并不太容易,注意到不能继续操作的时候肯定是除去 \(V\) 中位的时候剩余的数各不相同,这个看起来很容易计数,我们考虑计数不能的方案再减去。
首先我们计算总的方案数,记 \(f_{i,j}\) 代表序列长为 \(i\),二进制位恰好有 \(j\) 位时的总序列数,那么直接容斥 \(j\),可以得到转移式:
然后我们考虑用 \(g_{i,j}\) 代表序列长为 \(i\),二进制位恰有 \(j\) 位时不合法序列数,这里我们考虑直接枚举到什么时候我们无法操作了,有转移式:
解释一下,\(f_{x,y}-g_{x,y}\) 是枚举的合法序列数量,\((2^y)^i\) 是因为我这剩下的 \(i-x\) 个数在这 \(y\) 位中可以随意选择,组合数就是选出来的方案数。
那么看到上面还有一个东西要求,我们可以再设一个,\(h_{i,j}\) 代表序列长为 \(i\),二进制位恰有 \(j\) 位时,所有数全都不同且没有 \(0\) 有多少种方案,还是对 \(j\) 容斥得到式子:
注意我们这里特别强调了没有 \(0\),因为如果我们前面填了 \(0\),但是我们在这个不能操作的序列中也有 0,这样就重复了,所以我们这里不能让他有 \(0\)。
注意到一个事情,如果说是奇数的 \(n\),那么显然最后的时候我们其实是可以填一个 \(0\) 上去的,所以注意转移 \(g\) 的时候此时不能转移。
复杂度 \(O(n^2k^2)\)。