1 条题解

  • 0
    @ 2025-8-24 23:16:11

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar WorldMachine
    请引领我至夜晚熠熠闪烁的群星之下

    搬运于2025-08-24 23:16:11,当前版本为作者最后更新于2025-01-23 12:59:01,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    有这样一个好想法:回滚莫队,维护奇数和偶数长度的答案,区间变长的时候奇数从偶数处转移,偶数从奇数处转移。不幸的是我不会转移,于是我想了一种更恶心的做法。


    lcm\text{lcm} 就是对每个素因子的次数取 max\maxgcd\gcd 就是对每个素因子的次数取 min\min

    类比 min-max 反演,有:

    $$\text{lcm}(T)=\prod_{S\subseteq T,S\not=\varnothing}(\gcd(S))^{(-1)^{|S|-1}} $$

    要求所有长度为奇数的子序列的 gcd\gcd 的平方之积,即:

    $$\text{lcm}([l,r])\cdot\prod_{S\subseteq [l,r],S\not=\varnothing}\gcd(S) $$

    于是问题变成两部分:求区间 lcm\text{lcm},以及求区间内所有子序列的 gcd\gcd 之积。


    第二部分,考虑根号分治。

    对于 pVp\le\sqrt V,设区间 [l,r][l,r]pp 次数为 kk 的数个数为 cntk\text{cnt}_k,那么 pp 的贡献(次数)为:

    $$\sum_{i=1}^{\lfloor\log_pV\rfloor}i\left(2^{\text{cnt}_i}-1\right)2^{\sum\limits_{j=i+1}^{\lfloor\log_pV\rfloor}\text{cnt}_j} $$

    预处理 22 的次幂,注意到次数会很大所以记得对 998244352998244352 取模。对于每个 pp 可以花 O(logV)\mathcal O(\log V) 的时间获得这部分的答案,这部分时间复杂度为 $\mathcal O\left((n+q)\cdot\dfrac{\sqrt V}{\log V}\cdot\log V\right)=\mathcal O((n+q)\sqrt V)$。

    对于 p>Vp>\sqrt V,性质是每一个 aia_i 至多会有一个这样的 pp。莫队,设当前 pp 的出现次数为 cntp\text{cnt}_p,那么 pp 的贡献为 p2cntp1p^{2^{\text{cnt}_p}-1},那么当前的答案为:

    $$\prod_{p>\sqrt V}p^{2^{\text{cnt}_p}-1}=\dfrac{\prod\limits_{p>\sqrt V}p^{2^{\text{cnt}_p}}}{\prod\limits_{p>\sqrt V}p} $$

    考虑如何计算分子。

    正常的做法是,维护 powp=p2cntp\text{pow}_p=p^{2^{\text{cnt}_p}},区间扩大时直接将 powp\text{pow}_p 平方顺便更新答案(所以还要维护一个 powp1\text{pow}^{-1}_p),缩小时就寄了,所以要使用回滚莫队。

    其实不用回滚莫队,设 powp,k=p2k\text{pow}_{p,k}=p^{2^k},这个可以把 2kmod9982443522^k\bmod 998244352 预处理出来,再预处理每个素数的光速幂,当然 powp,k1\text{pow}_{p,k}^{-1} 也一样地搞,这样就可以使用普通莫队了,但不好说哪个更快。

    upd:我好像学了个假的数据结构……上面的东西直接用指针数组搞出每个数要用到的值即可,总数是 nn 的。

    第二部分时间复杂度为 O((n+q)V+nq)\mathcal O((n+q)\sqrt V+n\sqrt q)


    尝试解决第一部分。有了第二部分的基础其实是简单的。

    对于 pVp\le\sqrt V 就是一个区间最大值,可以简单地做到 O((n+q)V)\mathcal O((n+q)\sqrt V)

    如果 p>Vp>\sqrt V,每个 pp 的次数至多为 11,大力做莫队即可。

    第一部分时间复杂度为 O((n+q)V+nq)\mathcal O((n+q)\sqrt V+n\sqrt q)


    结算:n,m,Vn,m,V 均同级,时间复杂度为 O(nn)\mathcal O(n\sqrt n),常数不小,但别写太劣就能过。

    代码应该不会很短,慢慢写。

    • 1

    信息

    ID
    11391
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者