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 ...
随机推荐
- PowerDotNet平台化软件架构设计与实现系列(10):文件平台
很多业务系统少不了需要进行文件管理,比如各种图片.excel.pdf.压缩包等等,为了高度可复用,我们抽象出文件平台,加强对文件进行管理. PowerDotNet文件平台目前支持阿里云OSS.Fast ...
- 第二十四个知识点:描述一个二进制m组的滑动窗口指数算法
第二十四个知识点:描述一个二进制m组的滑动窗口指数算法 简单回顾一下我们知道的. 大量的密码学算法的大数是基于指数问题的安全性,例如RSA或者DH算法.因此,现代密码学需要大指数模幂算法的有效实现.我 ...
- Optimization Landscape and Expressivity of DeepCNNs
目录 引 主要内容 基本的一些定义 卷积层 全连接层 池化层 改写卷积层 假设2.4 引理2.5 假设3.1 假设3.2 引理3.3 定理3.4 定理3.5 推论3.6 假设4.1 引理4.2 引理4 ...
- pytest之 fixture 实现机制
一.相同测试数据存放优化 在讲 fixture 实现机制之前,插入一段内容 上次有个小伙伴问我说,类似下面的用例代码情况,每条测试用例的数据都一样的,我们可以怎么进行优化吗? 当然是可以的 其实我们可 ...
- vue使用v-chart图表出现的问题
npm i v-charts echarts -S 引入 import VCharts from 'v-charts' Vue.use(VCharts) 后发现报错,后来发现安装echarts版本太高 ...
- Vue.js高效前端开发 • 【初识Vue.js】
全部章节 >>>> 文章目录 一.Vue概述 1.Web前端框架介绍 2.MVC和MVVM 3.Vue介绍 4.安装Vue 二.Vue使用 1.第一个Vue应用 2.Vue的双 ...
- .net core使用rabbitmq消息队列
看博文的朋友,本文有些过时了,还有些BUG,如果想了解更多用法,看看这篇吧:.net core使用rabbitmq消息队列 (二) 首先,如果你还没有安装好rabbitmq,可以参考我的博客: Ubu ...
- .net core中EFCore发出警告:More than twenty 'IServiceProvider' instances have been created for internal use by Entity Framework
最近使用.net core k开发时,碰到个问题,Ef使用中程序发出了一个警告: More than twenty 'IServiceProvider' instances have been cre ...
- 图像数据到网格数据-1——Marching Cubes算法的一种实现
概述 之前的博文已经完整的介绍了三维图像数据和三角形网格数据.在实际应用中,利用遥感硬件或者各种探测仪器,可以获得表征现实世界中物体的三维图像.比如利用CT机扫描人体得到人体断层扫描图像,就是一个表征 ...
- CSS基础 盒子相关属性总结 padding+border
1.border当个属性: 作用 属性名 属性值 边框粗细 border-width 数字+px 边框样式 border-style solid实线.dashed虚线.dotted点线 边框颜色 bo ...