orz α
dp
翻译官方题解。
一
考虑 这个条件可以将序列与可重集构成一组双射。问题就是计算包含 个 的数的可重集 的个数使得 xor 和为 .而考虑一个值只有出现奇数次才会产生贡献,那么对这个进行计数,再算一下剩下偶数次的贡献即可。
具体地,令 为 个 的两两不同的数组成的序列个数使得 xor 和为 ,然后考虑剩余 个数必须是每个值都出现偶数次,那么即有:
这里 的定义从可重集修改为序列是因为少了 这样的限制可能会更容易地计数。
二
现在有 ,两两不同,xor 和为 这三个限制,而 和 xor 和为 这两个限制都能很好和数位 dp 结合,而两两不同难以在数位 dp 中描述。那就先用数位 dp 求出可以出现相同的方案数,再减去不合法的方案数。前者很容易用 表示从高到低考虑到了第 位,有 个已经脱离了上界的限制,并且前面的位都满足 xor 的限制,方案数是多少。转移的时候枚举有几个新脱离上界的数,这里对于每个 可以 解决。
减去不合法的情况,先考虑不合法的情况的形态能怎么描述。
这里还是考虑按奇偶分,因为出现偶数次的不会对 xor 产生贡献。为了能够计数还要记奇数和偶数各出现了多少种。所以将不合法的情况划分成这样的等价类:
- 出现次数为奇数的一共出现了 次;
- 出现次数为奇数的一共有 种();
- 出现次数为偶数的一共出现了 种。
对于每个 计算这个等价类的方案数:
- 选出值的出现次数为奇数的位置, 种方案;
- 奇数内部安排位置,要算 个元素划分成 个大小为奇数的集合方案数 ,偶数同理要计算
- 给产生贡献的 种数(也就是出现次数为奇数的值)分配取值,有 种方案;给出现次数为偶数的值分配取值,有 种方案。
那么就是每次要减去:
而计算 可以提前 预处理出来(枚举最后这个元素所在集合大小)。
而最后这个很容易通过前缀和优化做到每次 统计。
那么总的复杂度就是 .
生成函数
alpha1022 太强大了!
令 为集合幂级数的元,其中乘法是作异或卷积。 是形式幂级数的元,记录选了多少个数。生成函数直接列出来:
先在 这一维上做 FWT.
再做一下 IFWT.
然后提取 .
再往后一步真是神之一眼!α:这个老典了/shui
结论是 只有本质不同 个。也就是 只有本质不同的 种,
首先考虑 的情况,当且仅当 的最后 位都为 的时候求和为 ,如果有一个 出现就为 .易证。
然后考虑将所有的 挂在 Trie 树上,这样被划分成了 棵子树, 每次有一个 就会往左分出去一个子树。然后考虑一个 怎样计算答案,发现 lowbit 那一位之上(不含)的那些子树贡献一定为 , 是这个子树的深度为多少, 的后 位出现了 ,而不管上面 位贡献多少只不过是 和 的区别,答案都是 .然后考虑 lowbit 那一位及以下的那些子树,它们贡献 还是 就取决于 的奇偶性了。
所以只需要知道 的 lowbit 在哪里, 的 lowbit 是否在 中,以及 的奇偶性即可算出 的值。计算这样的 有多少个也是简单的。
最后的问题就是有 个 ,计算:
直接枚举左边 和右边 然后组合数乘起来就行。
qycnb!d-finite,存在整式递推。令 ,,通分之后提取 得到整式递推。这样能求出所有的系数,然后就可以对所有的 都算出来答案了!!!对 d-finite 还是不熟/fn/fn/fn
时间复杂度就是 .
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
2022-02-12 「题解」LOJ #6499. 「雅礼集训 2018 Day2」颜色