「题解」ABC288Ex A Nameless Counting Problem 翻译官方题解 + 生成函数做法
orz α
dp
翻译官方题解。
一
考虑 \(A_i\leq A_{i+1}\) 这个条件可以将序列与可重集构成一组双射。问题就是计算包含 \(N\) 个 \(\leq M\) 的数的可重集 \(A\) 的个数使得 xor 和为 \(X\).而考虑一个值只有出现奇数次才会产生贡献,那么对这个进行计数,再算一下剩下偶数次的贡献即可。
具体地,令 \(g_L\) 为 \(L\) 个 \(\leq M\) 的两两不同的数组成的序列个数使得 xor 和为 \(X\),然后考虑剩余 \(N-L\) 个数必须是每个值都出现偶数次,那么即有:
这里 \(g\) 的定义从可重集修改为序列是因为少了 \(A_i\leq A_{i+1}\) 这样的限制可能会更容易地计数。
二
现在有 \(\leq M\),两两不同,xor 和为 \(X\) 这三个限制,而 \(\leq M\) 和 xor 和为 \(X\) 这两个限制都能很好和数位 dp 结合,而两两不同难以在数位 dp 中描述。那就先用数位 dp 求出可以出现相同的方案数,再减去不合法的方案数。前者很容易用 \(f_{i,j}\) 表示从高到低考虑到了第 \(i\) 位,有 \(j\) 个已经脱离了上界的限制,并且前面的位都满足 xor 的限制,方案数是多少。转移的时候枚举有几个新脱离上界的数,这里对于每个 \(L\) 可以 \(\mathcal{O}(L^2\log M)\) 解决。
减去不合法的情况,先考虑不合法的情况的形态能怎么描述。
这里还是考虑按奇偶分,因为出现偶数次的不会对 xor 产生贡献。为了能够计数还要记奇数和偶数各出现了多少种。所以将不合法的情况划分成这样的等价类:
- 出现次数为奇数的一共出现了 \(i\) 次;
- 出现次数为奇数的一共有 \(j\) 种(\(j<L\));
- 出现次数为偶数的一共出现了 \(k\) 种。
对于每个 \((i,j,k)\) 计算这个等价类的方案数:
- 选出值的出现次数为奇数的位置,\(\binom{L}{i}\) 种方案;
- 奇数内部安排位置,要算 \(i\) 个元素划分成 \(j\) 个大小为奇数的集合方案数 \(\text{odd}(i,j)\),偶数同理要计算 \(\text{even}(L-i,k)\)
- 给产生贡献的 \(j\) 种数(也就是出现次数为奇数的值)分配取值,有 \(g_j\) 种方案;给出现次数为偶数的值分配取值,有 \((M+1-j)^{\underline k}\) 种方案。
那么就是每次要减去:
而计算 \(\text{odd}(i,j),\text{even}(i,j)\) 可以提前 \(\mathcal{O}(N^3)\) 预处理出来(枚举最后这个元素所在集合大小)。
而最后这个很容易通过前缀和优化做到每次 \(\mathcal{O}(L^2)\) 统计。
那么总的复杂度就是 \(\mathcal{O}(N^3\log M)\).
生成函数
alpha1022 太强大了!
令 \(x\) 为集合幂级数的元,其中乘法是作异或卷积。\(t\) 是形式幂级数的元,记录选了多少个数。生成函数直接列出来:
先在 \(x\) 这一维上做 FWT.
再做一下 IFWT.
然后提取 \([t^N]\).
再往后一步真是神之一眼!α:这个老典了/shui
结论是 \(\prod_{S=0}^M (1+(-1)^{|S\cap T|}t)\) 只有本质不同 \(\mathcal{O}{(L)}\) 个。也就是 \(\sum _{S=0}^M[2\mid|S\cap T|]\) 只有本质不同的 \(\mathcal{O}(L)\) 种,
首先考虑 \(M=2^L-1\) 的情况,当且仅当 \(T\) 的最后 \(L\) 位都为 \(0\) 的时候求和为 \(2^L-1\),如果有一个 \(1\) 出现就为 \(2^{L-1}\).易证。
然后考虑将所有的 \(S\) 挂在 Trie 树上,这样被划分成了 \(\mathcal{O}(L)\) 棵子树,\(M\) 每次有一个 \(1\) 就会往左分出去一个子树。然后考虑一个 \(T\) 怎样计算答案,发现 lowbit 那一位之上(不含)的那些子树贡献一定为 \(2^{d-1}\),\(d\) 是这个子树的深度为多少,\(T\) 的后 \(d\) 位出现了 \(1\),而不管上面 \(L-d\) 位贡献多少只不过是 \([2\mid |S\cap T|]\) 和 \(|2\not\mid |S\cap T||\) 的区别,答案都是 \(2^{d-1}\).然后考虑 lowbit 那一位及以下的那些子树,它们贡献 \(0\) 还是 \(2^{d}\) 就取决于 \(|T\cap M|\) 的奇偶性了。
所以只需要知道 \(T\) 的 lowbit 在哪里,\(T\) 的 lowbit 是否在 \(M\) 中,以及 \(|T\cap M|\) 的奇偶性即可算出 \(\sum _{S=0}^M[2\mid|S\cap T|]\) 的值。计算这样的 \(T\) 有多少个也是简单的。
最后的问题就是有 \(\mathcal{O}(L)\) 个 \(c_i\),计算:
直接枚举左边 \(t^i\) 和右边 \(t^{N-i}\) 然后组合数乘起来就行。
qycnb!d-finite,存在整式递推。令 \(F(t)=(1+t)^a(1-t)^b\),\(F^\prime(t)=\frac{aF(t)}{(1+t)}+\frac{bF(t)}{(1-t)}\),通分之后提取 \([t^N]\) 得到整式递推。这样能求出所有的系数,然后就可以对所有的 \(N\) 都算出来答案了!!!对 d-finite 还是不熟/fn/fn/fn
时间复杂度就是 \(\mathcal{O}(N\log M)\).