ARC084F - XorShift
有两种解法,这里都放一下。
解法一
首先易知异或运算可以视作是 \(\mathbb{F}_2\) 意义下的每一位独立的加法。
因此我们可以考虑对于每个二进制数 \(s\) 构造一个多项式 \(F(x) = \sum\limits_i ^ n a_i x ^ i\) 其中 \(a_i\) 为 \(s\) 第 \(i\) 位的值。
此时可以发现异或本质上就是两个多项式在 \(\mathbb{F}_2\) 意义下的加法。
同时依照题意,将 \(x \to x \times 2\) 就可以视作将一个多项式整体 \(\times x\)。
根据分配律,最终写在黑板上的多项式一定形如:
\]
其中 \(G_i(x)\) 为任意一个多项式,通过简单推导同样可以发现 \(\mathbb{F}_2\) 意义下依然满足裴蜀定理。
因此可以求出 \(\gcd(F_1(x), F_2(x), \cdots, F_n(x)) = t(x)\),具体地辗转相除法在 \(\mathbb{F}_2\) 意义下同样成立。
在这里由于实现的是暴力多项式取模,用势能分析可知复杂度是 \(\mathcal{O}(\frac{nL ^ 2}{\omega})\) 的(使用 \(\rm bitset\) 优化)
于是问题转化为有多少个 \(t(x)G(x) = f(x)\) 其中 \(G(x)\) 为任意一个多项式,使得 \(f(x)\) 的系数字典序小于给定的一个多项式 \(b(x)\)。
枚举 \(f(x)\) 前 \(i - 1\) 位卡满,第 \(i\) 填 \(0\) 且第 \([x ^ i]b(x) = 1\),分两种情况讨论:
若 \(\deg f(x) - i + 1 \ge \deg b(x)\),则易知任意选定 \(\deg b(x) \sim \deg f(x) - i\) 位上的值,\(0 \sim \deg b(x) - 1\) 上将存在且唯一确定一个取值,因此这部分方案为 \(2 ^ {\deg f(x) - i - \deg b(x) + 1}\)。
否则,根据第一条的结论,我们只考虑 \(\deg f(x) - i + 1 = \deg b(x) - 1\) 的情况。只需多项式取模求出唯一的多项式,然后比较这个多项式是否字典序小即可。
于是这个问题得以解决,复杂度 \(\mathcal{O}(\frac{nL ^ 2}{\omega})\),瓶颈在于求 \(n\) 个多项式的 \(\gcd\)。
解法二
首先需要观察出一点性质:\((a \oplus b) \times 2 ^ c = (a \times 2 ^ c) \oplus (b \times 2 ^ c)\)(分配律)。
因此我们可以将最终黑板上写数的运算过程拆开,改写成:
\]
其中 \(b_i\) 为 \(a_{1 \sim n}\) 中的任意一个。
这样一来,如果我们能把 \(a_i \times 2 ^ c(c \ge 0)\) 全部插入线性基,就能借助线性基使用数位 \(\rm dp\) 统计答案。
但注意到这里需要插入的数量是无限个的,因此需要找到必要的插入线性基内的元素。
注意到数位 \(\rm dp\) 的时候我们只关注线性基中最后 \(|M|\) 位上的元素,因此我们只需求出这部分线性基即可。
同时,我们发现第一个数 \(a_1 \times 2 ^ c\) 插入线性基时,\(\forall c \ge 0\) 都是原模原样直接插入到最高位的,因此本质上 \(\ge |a_1|\) 的位此时线性基上都是存在一个元素的。
接下来继续插入 \(a_2\) 的时候,有如下观察:
- 在至多插入从小到大 \(2\max(|a_1|, |a_2|) - |a_2|\) 个元素之后接下来所有插入的元素都会线性相关。
首先我们证明一点:如果在插入 \(a_2 \times 2 ^ p\) 时线性相关,那么 \(\forall q \ge p, a_2 \times 2 ^ q\) 在插入时都是线性相关的。
原因是 \(a_2 \times 2 ^ p\) 一定能被已经插入 \((a_1 \times 2 ^ {c_1}) \oplus (a_1 \times 2 ^ {c_2}) \oplus \cdots \oplus (a_1 \times 2 ^ {c_k})\) 来表示。
将 \(\forall i, c_i \leftarrow c_i + 1\) 后的数一定也被插入线性基,因此 \(\forall q \ge p, a_2 \times 2 ^ q\) 在插入时都是线性相关的。
于是只要证明插入的第一个线性相关的元素的指数不超过 \(2\max(|a_1|, |a_2|) - |a_2|\) 即可。
令 \(L = \max(|a_1|, |a_2|)\),则易知第 \(L \sim 2L\) 位线性基上都存在元素,此时线性基上只存在恰好 \(L - 1\) 个空位。
\(a_2\) 从第 \(|a_2|\) 位开始插起,在插到 \(2L\) 之前要插 \(2L - |a_2| + 1 \ge L + 1\) 个元素。
我们知道再插 \(L - 1\) 个元素后就线性基就满了,因此在次过程中至少存在一个元素插入时会线性相关。
由此我们也可以得到一个推论:令 \(L = \max\limits_{i = 1} ^ n |a_i|\),则除了第一个元素外,其他元素插入到 \(a_i \times 2 ^ {2L - |a_i|}\) 后就一定与线性基内元素线性相关。
此时我们再令 \(L \leftarrow \max(L, |M|)\)。
注意到我们并不关注 \(> L\) 的线性基长什么样子,于是我们只需要 \(\forall i\) 在线性基内插入 \(a_i \times 2 ^ {c}(0 \le c \le 2L - |a_i|)\) 即可得到这个我们关注的线性基。
于是我们将插入的元素变为了有限个,此时直接暴力复杂度:\(\mathcal{O}(\frac{nL ^ 3}{\omega})\) 考虑优化,有如下观察(根据中间的证明部分类似地可以证明):
- 在插入 \(s = a_i \times 2 ^ c\) 之后如果经过线性基最终消成了 \(t\),那么 \(s \times 2\) 经过线性基至少能被消成 \(t \times 2\),也即接下来插入 \(s \times 2\) 与插入 \(t \times 2\) 等价。
那么根据势能分析,插入一个元素的所有衍生元素 \(a_i \times 2 ^ c(0 \le c \le 2L - |a_i|)\) 时,至多只会消元 \(\mathcal{O}(L)\) 次,因此复杂度降到了 \(\mathcal{O}(\frac{nL ^ 2}{\omega})\)。
ARC084F - XorShift的更多相关文章
- AtCoder刷题记录
构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...
- [atARC084F]XorShift
如果异或变为加法和减法,那么根据扩欧,$k$合法当且仅当$k|\gcd_{i=1}^{n}a_{i}$ 换一种方式定义约数:$x$是$y$的约数当且仅当存在$p_{i}\in \{0,1\}$使得$\ ...
- Atcoder Regular Contst 084 D - XorShift(bitset)
洛谷题面传送门 & Atcoder 题面传送门 没错,这就是 Small Multiple 那场的 F,显然这种思维题对我来说都是不可做题/cg/cg/cg 首先如果我们把每个二进制数看作一个 ...
- canvas星星炫耀
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 11.Object方法
综述 Object是Java中所有类的父类,对它的学习十分的重要, Object的函数除了final方法,基本上都是被设计为要被覆盖的(Override),这节我们就一起来学习这些函数. 1.equa ...
- 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【JAVA并发编程实战】10、并发程序的测试
1.产生随机数 package cn.study.concurrency.ch12; public class Util { public static int xorShift(int y) { / ...
- 浅谈Java中的hashcode方法
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...
- Java多线程系列--“JUC集合”05之 ConcurrentSkipListMap
概要 本章对Java.util.concurrent包中的ConcurrentSkipListMap类进行详细的介绍.内容包括:ConcurrentSkipListMap介绍ConcurrentSki ...
随机推荐
- 第三十五个知识点:给针对ECDLP问题的Pollard rho,Pollard "Kangaroo",parallel Pollard rho攻击的一个粗略的描述
第三十五个知识点:给针对ECDLP问题的Pollard rho,Pollard "Kangaroo",parallel Pollard rho攻击的一个粗略的描述 我们的目标是对任 ...
- Java——HashMap集合详解
第一章 HashMap集合简介 1.1 介绍 HashMap基于哈希表的Map接口实现,是以key-value存储形式存在,即主要用来存放键值对.HashMap 的实现不是同步的,这意味着它不是线程安 ...
- 标准基座获取定位可以获取address城市,自定义基座获取不到address
正常的返回应该 { "type": "WGS84", "altitude": 0, "latitude": 31.830 ...
- MongoDB高级应用之高可用方案实战(4)
1.MongDB启动与关闭 1.1.命令行启动 ./mongod --fork --dbpath=/opt/mongodb/data ----logpath=/opt/mongodb/log/mong ...
- Linux 使用 scp 命令远程拷贝文件和目录
使用方法: $ scp --help scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o s ...
- 为什么要避免在 Go 中使用 ioutil.ReadAll?
原文链接: 为什么要避免在 Go 中使用 ioutil.ReadAll? ioutil.ReadAll 主要的作用是从一个 io.Reader 中读取所有数据,直到结尾. 在 GitHub 上搜索 i ...
- PPT2010制作清明上河图动画
原文: https://www.toutiao.com/i6492312556915393038/ 新建一个空白幻灯片 选择"插入"选项卡,"图像"功能组,&q ...
- SpringCloud的Config应用
一.简介 ***应用程序先注册到注册中心,在注册中心根据guli-config服务的名字找到配置中心,然后在配置中心根据配置从github加载基本配置. 二.配置中心(服务端,可以部署集群) 1.依赖 ...
- Python多环境管理神器(Anaconda)
为了解决python多版本共存,解决不同版本之间的依赖冲突,虚拟环境隔离等问题,我们前面介绍了venv.virtualenv.virtualenvwrapper.pyenv.pipenv等众多工具.下 ...
- k8s的应用包管理工具helm的部署和使用
1.概述 我们一般是在k8s里面部署一些简单的应用,比如用deployment,daemonset,statefuleset的方式来部署应用,但是如果要部署一些复杂的应用,那么整个配置的编写.部署的过 ...