有两种解法,这里都放一下。

解法一

首先易知异或运算可以视作是 \(\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\)。

根据分配律,最终写在黑板上的多项式一定形如:

\[F_1(x)G_1(x) + F_2(x)G_2(x) + \cdots F_n(x)G_n(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_1 \times 2 ^ {c_1}) \oplus (b_2 \times 2 ^ {c_2}) \oplus \cdots \oplus (b_k \times 2 ^ {c_k})
\]

其中 \(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的更多相关文章

  1. AtCoder刷题记录

    构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...

  2. [atARC084F]XorShift

    如果异或变为加法和减法,那么根据扩欧,$k$合法当且仅当$k|\gcd_{i=1}^{n}a_{i}$ 换一种方式定义约数:$x$是$y$的约数当且仅当存在$p_{i}\in \{0,1\}$使得$\ ...

  3. Atcoder Regular Contst 084 D - XorShift(bitset)

    洛谷题面传送门 & Atcoder 题面传送门 没错,这就是 Small Multiple 那场的 F,显然这种思维题对我来说都是不可做题/cg/cg/cg 首先如果我们把每个二进制数看作一个 ...

  4. canvas星星炫耀

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. 11.Object方法

    综述 Object是Java中所有类的父类,对它的学习十分的重要, Object的函数除了final方法,基本上都是被设计为要被覆盖的(Override),这节我们就一起来学习这些函数. 1.equa ...

  6. 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  7. 【JAVA并发编程实战】10、并发程序的测试

    1.产生随机数 package cn.study.concurrency.ch12; public class Util { public static int xorShift(int y) { / ...

  8. 浅谈Java中的hashcode方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...

  9. Java多线程系列--“JUC集合”05之 ConcurrentSkipListMap

    概要 本章对Java.util.concurrent包中的ConcurrentSkipListMap类进行详细的介绍.内容包括:ConcurrentSkipListMap介绍ConcurrentSki ...

随机推荐

  1. C++单元测试框架gtest使用

    作用 作为代码编码人员,写完代码,不仅要保证编译通过和运行,还要保证逻辑尽量正确.单元测试是对软件可测试最小单元的检查和校验.单元测试与其他测试不同,单元测试可看作是编码工作的一部分,应该由程序员完成 ...

  2. 第47篇-解释执行的Java方法调用native方法小实例

    举个小实例,如下: public class TestJNI { static { // 程序在加载时,自动加载libdiaoyong.so库 System.loadLibrary("dia ...

  3. matplotlib 进阶之Legend guide

    目录 matplotlib.pyplot.legend 方法1自动检测 方法2为现有的Artist添加 方3显示添加图例 控制图例的输入 为一类Artist设置图例 Legend 的位置 loc, b ...

  4. 编写Java程序,随机给定一个数字猜大小

    返回本章节 返回作业目录 需求说明: 由系统随机生成一个1~100之间的整数. 通过控制台一直输入一个整数,比较该数与系统随机生成的那个数,如果大就输出"猜大了.",继续输入:如果 ...

  5. centos6.5-搭建Apache

    准备工作 1.关闭防火墙 service iptables stop 2.关闭selinux安全机制 setenforce 0 3.卸载rpm格式的httpd 这说明已经安装了rpm格式的软件包.所以 ...

  6. CSS基础 实战案例 模拟小米官方导航栏

    效果图 html结构 <ul> <li><a href="#">Xiaomi手机</a></li> <li> ...

  7. OpenIddict 登录及详细流程解析

    GitHub上实例都是集成了Identity来实现,我这里去掉了相关东西,实现自定义的登录满足自己的结构要求 服务端配置添加数据库服务以及定时任务服务 builder.Services.AddDbCo ...

  8. Python中类的变量,一个下划线与两个下划线的区别

    形似       功能 __xx 这是私有变量, 只有内部可以访问,外部不可以访问.但是也不是一定不可以访问,只要以 _类名__xx样式就可以访问 .但最好不要这样做,养成良好编程习惯 _x 这是实例 ...

  9. Go语言实战爬虫项目

    Go语言爬虫框架之Colly和Goquery Python爬虫框架比较多有requests.urllib, pyquery,scrapy等,解析库有BeautifulSoup.pyquery.Scra ...

  10. HDOJ1573X问题

    https://acm.hdu.edu.cn/showproblem.php?pid=1573 n组线性同余方程求解,最后求出多少解.而最终的解的周期为最小公倍数,范围内的,需要这样算.如果最小超过, ...