zoukankan      html  css  js  c++  java
  • 「codeforces

    link。


    (l = lceillog_2k ceil),在本题中你可以粗暴地认为 (l = 4)

    对于某一个 (x) 而言,(x-0, x-1, dots, x-k) 有极强的相关性,具体而言有以下两种情况:

    (1)(x) 二进制下末 (l)(geq k),此时 (x-0dots x-k) 除了末 (l) 位全部相同。

    提前给答案异或上 (x)(l) 位以外的位(这些位始终不变),不难发现 (x) 有效部分其实只有末 (l) 位。

    (2)(x) 二进制下末 (l)(< k),此时取 (x) 除末 (l) 位以外的最低非零位 (p)

    那么 (x-0dots x-k) 除了末 (l) 位,末 (l + 1sim p) 位一定形如 0...011...10,其他位始终相同。

    一样可以发现 (x) 有效部分仅取决于末 (l) 位与 (p)

    这导出一个重要的事实:本质不同的 (x) 只有 (O(c2^l) = O(ck)) 种。

    p.s.:我们稍后将会看到,这里的分析其实还导出了另一个非常重要的事实。


    我们记 (F(y, mathrm s)) 这个二元 GF,其中 (y) 是 EGF,(mathrm s) 是集合幂级数,第 (y^imathrm s^j) 项对应系数含义为 “选 (i) 个数异或和为 (j) 的方案数”。

    容易发现,题目本身就是求 (n) 个形如 (left(sum_{i=0}^kfrac{y^i}{i!}mathrm s^{x-i} ight)) 的二元 GF 的卷积。

    由于我们将本质相同的 (x) 放在了一起,问题变成求 (O(ck)) 个形如 (left(sum_{i=0}^kfrac{y^i}{i!}mathrm s^{x-i} ight)^t) 的卷积。

    (mathrm s) 视作主元做 fwt,只需要分别将每一位所有的 ((sum_{i=0}^k a_iy^i)^t) 卷起来,最后取第 (k) 项并 ifwt 回去即可得到答案。

    注意到项数只有 (O(k)) 项,可以考虑做 (O(k^2)) 的 ln + exp 优化求 (t) 次幂的过程。由于始终是做卷积,可以在 ifwt 之前再 exp。

    (O(ck)) 个 GF 做 fwt 的复杂度为 (O(ck imes c2^c imes k))(注意我们的对象是 (O(k)) 的多项式);

    (O(ck)) 个 fwt 后的每个多项式做 ln 的总复杂度为 (O(ck imes 2^c imes k^2))(求 ln 时需要常数项为 1,注意处理符号)

    合并只需要对应位相加,复杂度为 (O(2^c imes ck imes k))

    最后 exp 的总复杂度为 (O(2^c imes k^2))

    最后 ifwt 的复杂度为 (O(c2^c))

    由此,我们得到一个 (O((c+k)ck^22^c)) 的朴素实现。


    一个简单的观察:(left(sum_{i=0}^kfrac{y^i}{i!}mathrm s^{x-i} ight)) 项数很少。考虑从此入手优化。

    直接用定义做 fwt 可以做到 (O(ck imes k2^c))

    依照 fwt 的定义,最后求 ln 的多项式一定形如 (1 + left(sum_{i=1}^{k} pmfrac{y^i}{i!} ight)),一共只会有 (O(2^k)) 种可能性,因此做个 (O(2^k imes k^2)) 的预处理即可。

    这样可以将其优化到 (O(ck^22^c))


    回到一开始的性质。

    情况(1)只有末 (l) 项,这意味着 fwt 之后的结果本质只有 (2^l) 个不同的位

    情况(2)虽然可能会有 (p) 位发生改变,但它的信息量只有 (l + 1) 位(其中一个信息为 “(l + 1sim p)0...01 还是 1...10”),所以类似的有 fwt 之后的结果本质只有 (2^{l+1}) 个不同的位

    严格来说,fwt 之后的结果只跟它们张成的线性空间维数有关。

    这意味着我们可以将 (O(2^c)) 的 fwt 缩成 (O(2^l) = O(k)) 的 fwt(也没有预处理 ln 的必要了)。

    如果不预处理 ln,则 fwt + ln 这两部分的复杂度降到 (O(ck imes 2^l imes k^2) = O(ck^4))

    然而合并还是 (O(2^c imes ck imes k)) 的复杂度,依然考虑把 (O(2^c)) 降到 (O(2^l))

    把情况(1)中的所有多项式,与情况(2)中 (p) 相同的所有多项式先合并,复杂度变为 (O(2^c imes c imes k + 2^l imes ck imes k))

    那么,最终的总复杂度为 (O(c(c+k)2^c + ck^4))

    参考实现:https://codeforces.com/contest/1408/submission/114282085


    我并不太清楚异或卷积能否使用 ln + exp 优化幂运算,感觉不太懂,总之先跑路了。

    希望有懂哥能教教我.jpg。

  • 相关阅读:
    上传github代码
    git 代码更新
    linux 遇见的问题
    How to stop pycharm show files in project in red color?
    Linux下动态库查找路径的问题
    centos7 建立虚拟目录
    [BZOJ3747] Kinoman
    [BZOJ2169] 连边
    [洛谷P4251] 小凸玩矩阵
    [洛谷P2764] 最小路径覆盖
  • 原文地址:https://www.cnblogs.com/Tiw-Air-OAO/p/14710872.html
Copyright © 2011-2022 走看看