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 ...
随机推荐
- BZOJ 1857: [Scoi2010]传送带(三分套三分)
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 2549 Solved: 1370 [Submit][Status][Discuss] Descriptio ...
- 使用PyTorch构建神经网络模型进行手写识别
使用PyTorch构建神经网络模型进行手写识别 PyTorch是一种基于Torch库的开源机器学习库,应用于计算机视觉和自然语言处理等应用,本章内容将从安装以及通过Torch构建基础的神经网络,计算梯 ...
- 解决vite+elementplus 打包后出现的下拉列表多出空元素的bug
打包后下拉列表出现的空元素bug 之前的项目element-plus版本是 "^1.0.2-beta.70" 把他升级一下就好了 npm i element-plus@1.0.2 ...
- SpringCloud集成Security安全(Config配置中心)
1.说明 为了保护配置中心的敏感数据, 需要对Config Server进行安全保护, 本文基于Spring Security方案, 为Config Server增加最简单的Basic安全认证. 2. ...
- Storm集群开启HA高可用
Storm开启HA高可用,包括Nimbus和UI开启两个及以上的进程. 基于已经安装好的Storm集群,开启关键节点角色的HA高可用. Storm安装请参考Storm集群安装Version1.0.1 ...
- Python 利用@property装饰器和property()方法将一个方法变成属性调用
在创建实例属性时,如果直接把实例属性暴露出去,虽然写起来简单,但是存在一些风险,比如实例属性可以在外部被修改. 为了限制外部操作,可以通过一个set_score()方法来设置成绩,再通过一个get_s ...
- github 创建网络仓库 ,使用git工具将本地文件上传/删除 --- 心得
1.前言 使用 git做项目控制版本工具,当然,使用SVN也可以,但是,git让人感觉更先进一些,与GitHub结合,用起来很方便,服务端由官网控制. 而SVN分客户端和服务端,都是个人控制,因此, ...
- HDOJ1573X问题
https://acm.hdu.edu.cn/showproblem.php?pid=1573 n组线性同余方程求解,最后求出多少解.而最终的解的周期为最小公倍数,范围内的,需要这样算.如果最小超过, ...
- JQuery iframe 刷新效果
假如有一个选项卡.tab-content,里面有多个iframe 只刷新显示的那个iframe,所以要用到:visible $('.tab-content iframe:visible')[0].co ...
- C# 10分钟完成百度翻译(机器翻译)——入门篇
我们之前基于百度ai开发平台实现了人脸识别 [1].文字识别 [2].语音识别 [3] 与合成的入门和进阶,今天我们来实现百度翻译的实现. 随着"一带一路"政策的开展,各种项目迎接 ...