1 条题解
-
0
自动搬运
来自洛谷,原作者为

nullqtr_pwp
我注意到有些人一直在做各种地方的cnoi题,但是并没有什么b用,可能是因为一直在舒适区里面舒服的卷,虐杀自己擅长的东西并获得成就感。搬运于
2025-08-24 22:54:42,当前版本为作者最后更新于2024-06-19 15:55:46,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
考虑 怎么做,即没有某些不等的限制。
问题为:给定 个数的数列 ,计数 的数量使得:
- 。
- 。
先给出结论,这个子问题的时间复杂度是 。 是值域。
有异或和 的很难处理。注意到 为某个值与 并无本质区别,直接转化成异或和为 。考虑钦定 ,计算此时异或和为 的方案数 ,再令 ,方案数为 ,那么显然前 个数异或和为 的方案数为 。
考虑异或和 怎么做。对于一种特殊情况: 时,可以让 任意取,此时无论如何在更低位都可以找到一个 满足值的限制,使得异或和 ,这种情况的方案数为 。
从这个方向进一步考虑,不妨设比第 位高的部分的异或和为 ,那么考虑最低 位能用以上方式调整的条件,让这个调整的位置是 ,那么要求 与 的比 位高的部分并不完全重合,那么就要求 。
枚举 。只考虑 以及 位以下的低位。设计 为: 表示前 个数,是否有位置作为自由元,第 位的异或和为 的贡献积。转移是容易的。
这样可以在 的时间解决这个子问题。
考虑原问题怎么做,不难想到容斥。
显然有一个对于边集 ,钦定 的边都不满足两端互不相等的做法,这样的复杂度是 ,不能接受。
注意到上述做法的细节:关注 中的边构成的连通块,进一步地,大小为奇数的连通块只关注最小的 ,大小为偶数的连通块直接乘上 。
所以我们可以简化成,连通块被划分成什么样子。
考虑重新分配涉及的边集的容斥系数。 显然可以拆到每个连通块上求 的积。对于每个连通块,容斥系数即为:导出子图边集中所有使得此点集的连通的边集的, 之和。可以 预处理这个,记录为 ,具体就是钦定一个部分与剩下的部分不连通,进行枚举子集。
直接枚举点集划分是 的,大概能过 。
事实上点集划分会导出,对于所有的 且连通块为奇数的序列 ,去跑最开始写的那个东西。不同的点集划分可能导出相同的 ,这样非常浪费,加一个哈希表本质上无法优化复杂度。
考虑枚举这个序列 ,难点在于求它的容斥系数 。
注意到 可以直接对于所有点按照 排序,然后按序从 进行连通块划分。 当前已经划分的点集的 。每次枚举到 时, 必然已经划分完毕,对后面造成贡献的只有 。枚举 的连通块 ,,直接更新 即可。
时间复杂度 。
- 1
信息
- ID
- 9755
- 时间
- 4000ms
- 内存
- 1024MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者