「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)\)。

「ARC 139F」Many Xor Optimization Problems【线性做法,踩标】的更多相关文章

  1. 「TJOI / HEOI2016」求和 的一个优秀线性做法

    我们把\(S(i, j)j!\)看成是把\(i\)个球每次选择一些球(不能为空)扔掉,选\(j\)次后把所有球都扔掉的情况数(顺序有关).因此\(S(i, j)j! = i![x^i](e^x - 1 ...

  2. Solution Set -「ARC 107」

    「ARC 107A」Simple Math   Link.   答案为: \[\frac{a(a+1)\cdot b(b+1)\cdot c(c+1)}{8} \] 「ARC 107B」Quadrup ...

  3. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  4. Solution -「ARC 101D」「AT4353」Robots and Exits

    \(\mathcal{Description}\)   Link.   有 \(n\) 个小球,坐标为 \(x_{1..n}\):还有 \(m\) 个洞,坐标为 \(y_{1..m}\),保证上述坐标 ...

  5. Solution -「ARC 110D」Binomial Coefficient is Fun

    \(\mathcal{Description}\)   Link.   给定非负整数序列 \(\{a_n\}\),设 \(\{b_n\}\) 是一个非负整数序列且 \(\sum_{i=1}^nb_i\ ...

  6. Solution -「ARC 124E」Pass to Next

    \(\mathcal{Description}\)   Link.   有 \(n\) 个人站成一个环,初始时第 \(i\) 个人手里有 \(a_i\) 个球.第 \(i\) 个人可以将自己手中任意数 ...

  7. Solution -「ARC 126E」Infinite Operations

    \(\mathcal{Description}\)   Link.   给定序列 \(\{a_n\}\),定义一次操作为: 选择 \(a_i<a_j\),以及一个 \(x\in\mathbb R ...

  8. Solution -「ARC 126F」Affine Sort

    \(\mathcal{Description}\)   Link.   给定 \(\{x_n\}\),令 \[f(k)=\left|\{(a,b,c)\mid a,b\in[0,c),c\in[1,k ...

  9. Solution -「ARC 125F」Tree Degree Subset Sum

    \(\mathcal{Description}\)   Link.   给定含有 \(n\) 个结点的树,求非负整数对 \((x,y)\) 的数量,满足存在 \(\exist S\subseteq V ...

随机推荐

  1. fetch,终于认识你

    fetch和XMLHttpRequest 如果看网上的fetch教程,会首先对比XMLHttpRequest和fetch的优劣,然后引出一堆看了很快会忘记的内容(本人记性不好).因此,我写一篇关于fe ...

  2. Override,Overload,Overwrite到底有什么区别?

    Override,Overload,Overwrite的区别[新手可忽略不影响继续学习] 方法的覆盖(Override)是指子类重写从父类继承来的一个同名方法(参数.返回值也同),马克-to-win: ...

  3. 在react项目中使用redux-thunk,react-redux,redux;使用总结

    先看是什么,再看怎么用: redux-thunk是一个redux的中间件,用来处理redux中的复杂逻辑,比如异步请求: redux-thunk中间件可以让action创建函数先不返回一个action ...

  4. Linux小工具的应用,grep,sort,wc,cut

    小工具的使用: 1.管道(|):连接多个命令的工具,进程之间通讯的一种方式 用法:命令1 | 命令2 | 命令3....2.grep工具:行过滤,打印出的结果一行一行的 用法:grep options ...

  5. SpringBoot内外部配置文件加载和优先级

    直接附链接:https://www.pianshen.com/article/28711537583/

  6. [转载] Golang交叉编译(跨平台编译)简述

    一.何为交叉编译 简单地说,就是在一个平台上生成另一个平台上的可执行代码.同一个体系结构可以运行不同的操作系统:同样,同一个操作系统也可以在不同的体系结构上运行. 二.交叉编译前的准备 本文只介绍Wi ...

  7. Pytest系列(一)初次了解

    在之前,我分享过unittest系列,后来有很多人问我,能不能出pytest的教程,正好最近在整理pytest相关的资料,那么,就趁着这个机会,去和大家分享一下pytest系列. pytest是一个非 ...

  8. 新手入门C语言第七章:C判断

    C 判断 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的). C 语言把任何非零和非空的值假定为 true,把零或 null  ...

  9. vue下一代状态管理Pinia.js 保证你看的明明白白!

    1.pinia的简单介绍 Pinia最初是在2019年11月左右重新设计使用Composition API的 Vue 商店外观的实验. 从那时起,最初的原则相同,但 Pinia 适用于 Vue 2 和 ...

  10. 论文解读(MERIT)《Multi-Scale Contrastive Siamese Networks for Self-Supervised Graph Representation Learning》

    论文信息 论文标题:Multi-Scale Contrastive Siamese Networks for Self-Supervised Graph Representation Learning ...