Luogu4495

前言

老师给的夯基训练题,感觉已有题解做法复杂度稍高,为此优化之。

一些记号

  • τ(P) 表示 P 的因子个数(即 d(P))。
  • ω(P) 表示 P 的本质不同质因子个数。

思路

把每个数 v 变为 gcd{v,P},显然不影响答案。

此时数的种类只有 O(τ(P)) 种。

则显然此时一种选法合法当且仅当 gcd{v|vB}|w,其中 B 代表选择的数的集合(背包)。

我们进行质因数分解,则每个数可被唯一分解。

P=pkak,v=pkbk(bkak)

因此在此意义下有良好的偏序关系。

定义每个数 v 的选法的 GF 为 zP+zv

不妨考虑对每个数的 GF 在每个质数的幂次上同时做 min 卷积,即所谓 gcd 卷积。显然此时再做一次 zeta 变换(也即 Dirichlet 前缀和)即得答案系数。

gcd 卷积就和我们的交 / 并卷积类似了。

于是考虑调用 CF449D 的套路。

zP+zv

其中乘法指 gcd 卷积。

我们把每个 GF 用 FMT 在数论上做一遍,逐项分别乘起来,IFMT 回去,就是 gcd 卷积,但这样复杂度不够优(为 O(min{n,τ(P)}τ(P)ω(P)) 的,也即此题大多数题解的复杂度)。

由于无论哪个位置,zP 在 FMT 后都会对之施以贡献,所以每个 zv 在其所能影响的范围的加上 1 相当于把 1 变成 2,也即乘以 2

于是不妨令所有 vv 位置直接施以 +1 的贡献,再做一次 FMT,然后在把每个位置的值 a 变为 2a,最后再 IFMT 回来。

复杂度分析

至此,复杂度为 O(nlogP+qlogP+τ(P)ω(P)),可近似认为是 O(nlogP+qlogP+P13loglogP),其中 logP 因子来源于 gcd 预处理(当然,是对着 P 的分解式搞)。

P 的质因数分解可用 Pollad-Rho 做到 O(P14+ϵ),此处不计。

事实上,通过更精细的方法,对 n,q 旁的 logP 因子可以作出进一步优化。

posted @   myee  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示