SNOI2017 遗失的答案

真的一点都不卡啊……

首先这个最大公倍数 G 明显是诈骗,如果 GL 一定无解,直接判掉。否则我们将 L,XN 都除 GN 之所以能直接除 G 是因为你取出来的数都必须是 G 的因数。而 [1,N] 中有 NG 个数满足这个条件。

然后问题变为:

[1,N] 中取若干数,Q 次询问,每次查询必须包含 X 的取数方案,使得 gcd1 并且 lcmL

显然我们取的数都是 L 的因数,于是可以对 L 质因数分解。假设质数 p 的次数为 rp。其次,L 的因数最多有 d=768 个,记为集合 F

由于 ω(108)=8,并且我们只关心每个数的质因子 p 次数是否为 0 或者 rp,所以考虑状压。可以对于每个 xF,将 x 的状态表示为一个 16 位的二进制数:前 8 位表示每个 p 的次数是否为 0,后 8 位表示每个 p 的次数是否为 rp

这一步预处理是 O(dω(L)+N) 的,写得再臭都能过。

先不考虑 X 的限制,答案就是取出若干个数,或起来为全集的方案数,将或起来为 S 的答案设为 fS

这是典,考虑容斥:令 gS 为或起来是 S 的子集的方案数。gS=TSfT,于是 fS=TS(1)|S||T|gT。由于答案 S 为全集,并且 |S|=2ω(L),所以 ans=T(1)|T|gT

考虑到 gS=2c(S)c(S)[1,N] 的数状态表示为 S 子集的个数,显然可以用 FWT 求出,做一遍子集和即可。

现在考虑有 X 的限制,改变 f,g 的定义为必须选 X 时,相应的意义。于是 gS=[XS]2c(S)1,即减去不选 X 的方案。

注意到 ans=T(1)|T|gT 仍然成立。所以:

ans=T(1)|T|gT=T(1)|T|[XT]2c(T)1=XT(1)|T|2c(T)1

考虑预处理出所有的 ans(X),这东西显然是个超集和,也可以 FWT 做。做完了,复杂度 O(n+ω(L)(d+2ω(L)))

真的一点也不卡常。在 LOJ 上只跑了 143 ms。

posted @   Arghariza  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示
主题色彩