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 ...
随机推荐
- 第二十个知识点:Merkle-Damgaard hash函数如何构造
第二十个知识点:Merkle-Damgaard hash函数如何构造 这里讲的是MD变换,MD变换的全称为Merkle-Damgaard变换.我们平时接触的hash函数都是先构造出一个防碰撞的压缩函数 ...
- [opencv]<学习Opencv>英文原版翻译学习
[注]下文全部内容为 <<Learning OpenCV 3: Computer Vision in C++ with the OpenCV Library>>经由在线翻译整理 ...
- <学习opencv>跨平台和本机windows
/*=========================================================================*/ // 跨平台和本机Windows /*=== ...
- Capstone CS5265替代龙迅LT8711|设计TYPEC转HDMI2.0投屏方案|替代龙迅LT8711方案
LT8711是一款高性能C型/DP1.2至HDMI2.0转换器,设计用于将USB typec或DP1.2源连接至HDMI2.0接收器.LT8711集成了兼容DP1.2的接收机和兼容HDMI2.0的发射 ...
- Java初学者作业——用户输入一个小数,程序分解出整数部分和小数部分。
返回本章节 返回作业目录 需求说明: 用户输入一个小数,程序分解出整数部分和小数部分. 实现思路: 接收用户控制台输入的小数. 用强制类型转换将整数部分得到. 使用用户输入的小数减去整数部分得到小数部 ...
- TKE 用户故事 | 作业帮 Kubernetes 原生调度器优化实践
作者 吕亚霖,2019年加入作业帮,作业帮架构研发负责人,在作业帮期间主导了云原生架构演进.推动实施容器化改造.服务治理.GO微服务框架.DevOps的落地实践. 简介 调度系统的本质是为计算服务/任 ...
- Git_同一个本地仓库上传到不同的远端仓库(github、gitee)
一.背景 github访问.推拉代码都太慢了,于是想把github上面的项目全部迁移到gitee(码云)上,但又不想放弃在github上维护项目,于是想同时维护两个远端仓库 二.准备工作 1.创建相同 ...
- linux 安装 Logtash 同步mysql数据到Elasticsearch
官网下载Logtash 离线安装包 下载地址 https://www.elastic.co/cn/downloads/logstash 需要注意版本与es 对应 新建配置文件 新建文件夹 mkdir ...
- 《剑指offer》面试题19. 正则表达式匹配
问题描述 请实现一个函数用来匹配包含'. '和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字符匹配整个模式. ...
- C++内嵌汇编 教程1
注:本文的所有代码是在我自己的VS2008中测试的,由于环境的差别,不能保证能在所有的编译器上运行. 1.内嵌汇编介绍 在C++中,可以通过__asm关键字来嵌入汇编语言.例如 int main(){ ...