「codeforces - 1408I」Bitwise Magic
记 ,在本题中你可以粗暴地认为 。
对于某一个 而言, 有极强的相关性,具体而言有以下两种情况:
(1) 二进制下末 位 ,此时 除了末 位全部相同。
提前给答案异或上 末 位以外的位(这些位始终不变),不难发现 有效部分其实只有末 位。
(2) 二进制下末 位 ,此时取 除末 位以外的最低非零位 。
那么 除了末 位,末 位一定形如
0...01
或1...10
,其他位始终相同。一样可以发现 有效部分仅取决于末 位与 。
这导出一个重要的事实:本质不同的 只有 种。
p.s.:我们稍后将会看到,这里的分析其实还导出了另一个非常重要的事实。
我们记 这个二元 GF,其中 是 EGF, 是集合幂级数,第 项对应系数含义为 “选 个数异或和为 的方案数”。
容易发现,题目本身就是求 个形如 的二元 GF 的卷积。
由于我们将本质相同的 放在了一起,问题变成求 个形如 的卷积。
将 视作主元做 fwt,只需要分别将每一位所有的 卷起来,最后取第 项并 ifwt 回去即可得到答案。
注意到项数只有 项,可以考虑做 的 ln + exp 优化求 次幂的过程。由于始终是做卷积,可以在 ifwt 之前再 exp。
对 个 GF 做 fwt 的复杂度为 (注意我们的对象是 的多项式);
对 个 fwt 后的每个多项式做 ln 的总复杂度为 (求 ln 时需要常数项为 1,注意处理符号)。
合并只需要对应位相加,复杂度为 。
最后 exp 的总复杂度为 。
最后 ifwt 的复杂度为 。
由此,我们得到一个 的朴素实现。
一个简单的观察: 项数很少。考虑从此入手优化。
直接用定义做 fwt 可以做到 。
依照 fwt 的定义,最后求 ln 的多项式一定形如 ,一共只会有 种可能性,因此做个 的预处理即可。
这样可以将其优化到 。
回到一开始的性质。
情况(1)只有末 项,这意味着 fwt 之后的结果本质只有 个不同的位。
情况(2)虽然可能会有 位发生改变,但它的信息量只有 位(其中一个信息为 “ 是 0...01
还是 1...10
”),所以类似的有 fwt 之后的结果本质只有 个不同的位。
严格来说,fwt 之后的结果只跟它们张成的线性空间维数有关。
这意味着我们可以将 的 fwt 缩成 的 fwt(也没有预处理 ln 的必要了)。
如果不预处理 ln,则 fwt + ln 这两部分的复杂度降到 。
然而合并还是 的复杂度,依然考虑把 降到 。
把情况(1)中的所有多项式,与情况(2)中 相同的所有多项式先合并,复杂度变为 。
那么,最终的总复杂度为 。
参考实现:https://codeforces.com/contest/1408/submission/114282085 。
我并不太清楚异或卷积能否使用 ln + exp 优化幂运算,感觉不太懂,总之先跑路了。
希望有懂哥能教教我.jpg。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现