• 「ARC 139F」Many Xor Optimization Problems【线性做法,踩标】


    「ARC 139F」Many Xor Optimization Problems

    对于一个长为 \(n\) 的序列 \(a\),我们记 \(f(a)\) 表示从 \(a\) 中选取若干数,可以得到的最大异或值。

    现在给定 \(n,m\),你需要对于所有长为 \(n\),且 \(0\le a_i<2^m\) 的序列,计算 \(f(a)\) 的和。

    \(1\le n,m\le 250000\)

    PS:本题解的做法可以做到 \(n=10^9,m=10^7\)

    Solution

    考虑给定序列 \(a\),我们计算 \(a\)正交线性基,不妨设基底有 \(k\) 个元素,其最高位分别为 \(a_1<a_2<\cdots<a_k\)。显然最大异或值就是这 \(k\) 个元素的异或和。

    这启发我们去枚举 \(k\) 以及 \(a_1,\cdots,a_k\) 计算对答案的贡献,贡献由三部分相乘得到:

    1. 多少个序列 \(a\),满足它的正交线性基满足基底有 \(k\) 个元素,且最高位分别为 \(a_1,\cdots,a_k\)

    2. \(k\) 个元素期望和;

    3. 序列 \(a\) 的这 \(k\) 个基底的其他 \(m-k\) 位的填法。

    对于第 1 部分,我们先只关心这 \(k\) 个位,考虑如下流程:

    • 初始线性基 \(S\) 大小为空;
    • 加入 \(a_i\)
      • 它与线性基内元素线性相关。那么有 \(2^{|S|}\) 种方案;
      • 它与线性基内元素线性无关。那么有 \(2^k-2^{|S|}\) 种方案。

    因此,方案为:

    \[[x^{n-k}]\prod\limits_{i=0}^{k} \frac{1}{1-2^ix}\times \prod\limits_{i=0}^{k-1}(2^k-2^i) \]

    容易看出前半部分为经典的 q-binomial,令 \(H(x)=\sum\limits_{k} \binom{n}{k}_2 x^k\),容易递推求出其所有项。

    对于第 2 部分,显然这 \(k\) 位必定是 \(1\),其余位都以 \(\frac 1 2\) 的概率是 \(1\),因此期望和为:

    \[\frac{2^{a_k+1}-1+\sum\limits_{i=1}^{k}2^{a_i}}{2} \]

    对于第 3 部分,由于是正交线性基,因此对于 \(a_j\) 所在的元素而言,所有 \(a_i<a_j\)\(a_i\) 位必须为 \(0\),其他位没限制,因此方案数为:

    \[\prod\limits_{i=1}^{k}2^{a_i-(i-1)} \]

    将三部分相乘,得到:

    \[[x^k]H(x)\prod\limits_{i=0}^{k-1}(2^k-2^i)\times \frac{2^{a_k+1}-1+\sum\limits_{i=1}^{k}2^{a_i}}{2}\times \prod_{i=1}^{k} 2^{a_i-(i-1)} \]

    计算这个式子,我们拆成 \(-1\)\(\sum\limits_{i=1}^{k}2^{a_i}\)\(2^{a_k+1}\) 三块分别计算。

    • 第一块

    显然要的就是 \([x^k]\prod\limits_{i=0}^{m-1}(1+2^ix)\)

    \(G(x)=\prod\limits_{i=0}^{m-1} (1+2^ix)\),易知:

    \[(1+2^mx)G(x)=(1+x)G(2x) \]

    对比 \([x^i]\) 项系数得:

    \[[x^i]G+2^m[x^{i-1}]G=2^i[x^i]G+2^{i-1}[x^{i-1}]G \]

    可以 \(\mathcal O(m)\) 递推得到。

    • 第二块

    这次乘上了 \(\sum a_i\) 的贡献,注意到 \(\sum a_i\) 可以看成是 \(2^m-1\) 再减去不在 \(a_i\) 的那些 \(2^i\)

    于是贡献就很显然了,是 \((2^m-1)[x^k]G-(k+1)[x^{k+1}]G\)

    • 第三块

    这次乘上了最大值(\(a_k\))的贡献,考虑枚举最大值为 \(mx\)

    \(F(x)=\sum\limits_{mx=0}^{m-1}(2^{mx})^2\prod\limits_{i=0}^{mx-1}(1+2^ix)\),易知:

    \[\left(F(x)-1+(2^m)^2\prod_{i=0}^{m-1}(1+2^ix)\right)=4(x+1)F(2x) \]

    对比 \([x^i]\) 项系数得:

    \[[x^i]F+2^{2m}[x^i]G=2^{i+2}[x^i]F+2^{i+1}[x^{i-1}]F \]

    仍可以 \(\mathcal O(m)\) 得到。

    因此总时间复杂度 \(\mathcal O(m+\log \text{mod})\)

    参考代码可以见 此 link,我偷懒所以逆元部分写的带 log 了,以及求 \(2^{n}\) 的地方带上了 \(\mathcal O(n)\)

  • 相关阅读:
    Python面试题汇总
    异常处理及反射
    DOM
    socket
    python生成器、迭代器、列表 字典 集合解析、迭代器表达式
    C++繁琐的类型转换,C++小知识之四种类型转换
    C++命名空间
    C++合并exe文件,将两个合并成一个
    BERT 之后,Transformer 还会出现高光时刻吗
    App开发常见布局,流式布局讲解
  • 原文地址:https://www.cnblogs.com/wlzhouzhuan/p/16191729.html
Copyright © 2020-2023  润新知