• 浅谈有限域在 OI 中的一些应用 (2023 国家集训队论文), 戚朗瑞.

  \(\textbf{Example 1.}\)

  给定一张有向图 \(G=(V,E)\), \(|V|=n\), \(|E|=m\). 要求找到一条最长的简单路径. 保证最长路径长度 \(k\ll n\).

  \(\textbf{Solution 1.}\)

  存在显然的 \(\mathcal O\left(\binom{n}{k}\operatorname{poly}(n)\right)\) 的算法, 但我们更希望找到一种 \(\mathcal O(T(k)\operatorname{poly}(n))\) 的算法. 不妨枚举路径长度 \(k\), 转化为判定性问题.

  构造多项式 这个算法策略大家或许已经很熟悉了: 钦定一个阈值 \(w\), 构造 \(\mathbb{GF}(2^w)\) 中的多项式, 使得 "存在长度为 \(k\) 的简单路径 \(\Leftrightarrow\) 多项式非 \(0\)" 的置信度足够高.

  首先, 我们给路径随机赋权. 设 \(X_{n\times n}\) 是一个在 \(\mathbb{GF}(2^w)\) 中随机生成的 \(n^2\) 个数组成的矩阵, 对于路径 \(P=(v_1,v_2,\cdots,v_k)\), 令其权值为 \(\prod_{i=1}^{k-1}X_{v_iv_{i+1}}\).

  当然, 接下来的难点在于剔除掉其中的非简单路径. 剔除的方法就需要利用域特征为 \(2\) 的性质: \(a+a=0\). 我们可以尝试使所有非简单路径对总和的贡献次数是偶数, 这样就能将它们的贡献剔除了. 同时, 利用环的性质, 若 \(P\) 有环, 就会有偶数种绕圈的方式, 也即将 \(P\) 中的边重排构成路径的方式是偶数.我们再随机生成一个矩阵 \(Y_{n\times k}\) 来描述这种构造. 对路径 \(P\), 我们将它的权值乘上

\[\sum_{\sigma\in S_k}\prod_{i=1}^kY_{v_i\sigma_i},
\]

其中 \(S_k\) 是全局 \(k\) 阶置换集合. 可以感受到, 当 \(v_i\) 两两不同时, 上式 "很大概率" 非 \(0\); 而当 \(v_i=v_j~(i\neq j)\) 时, 上式显然为 \(0\).

  最后, 我们就是要求出

\[P(X,Y)=\sum_{|P|=k}\prod_{i=1}^{k-1}X_{v_iv_{i+1}}\sum_{\sigma\in S_k}\prod_{i=1}^kY_{v_i\sigma_i}.
\]

构造过程到此为止, 接下来我们只需要计算这个结果就行.

  求解多项式 比较自然的想法: 对 \(\sigma\) 状压 DP. 令 \(f(u,S)\) 表示 \(v_{|S|}=u\) 且 \(\sigma\) 取过 \(S\) 中的值时, 上式的和. 转移枚举 \(u\) 的邻接点和 \(\sigma_{|S|+1}\) 的取值即可. 转移次数为 \(\mathcal O(2^kkm)\), 我们一般取 \(w\le\omega\) 更方便地使用位运算, 最终复杂度为 \(\mathcal O(2^kkmw)\).

  当然, 我们还能把 \(\mathcal O(2^kn)\) 的空间复杂度优化到线性. 利用容斥处理集合状态:

\[\begin{aligned}
\mathcal Y(P) &= \sum_{\sigma\in S_n}\prod_{i=1}^kY_{v_i\sigma_i}\\
&= \sum_{S\subseteq[1:k]}(-1)^{k-|S|}\prod_{i=1}^k\sum_{\sigma_i\in S}Y_{v_i\sigma_i}\\
&= \sum_{S\subseteq[1:k]}\prod_{i=1}^k\sum_{\sigma_i\in S}Y_{v_i\sigma_i}.
\end{aligned}
\]

这样 \(S\) 就能在外部枚举了.

  正确性分析 接下来的问题是考察算法正确性. 本质上, 我们构造出了以 \(x_{ij},y_{ij}\) 为变元的判别式 \(P(X,Y)\), 并考察是否有 \(P(X,Y)=0\). 当随机判断错误时, 我们相当于找到了一组 \(P(X,Y)\) 的根. 此时, 有 Schwartz-Zippel 引理:

  \(\textbf{Lemma (Schwartz-Zippel).}\) 若多项式 \(P\neq0\), 则 \(\Pr(P(r_1,r_2,\cdots,r_n)=0)\le d/|F|\), 其中 \(d=\deg P\), \(F\) 为系数域.

  \(\textbf{Proof.}\) 对 \(n\) 归纳. 当 \(n=1\) 时显然成立. 设 \(n=k\) 时成立, 现对 \(n=k+1\) 归纳:

  设 \(P\) 中 \(x_1\) 的最高次为 \(t\), 令 \(P=x_1^tQ(x_2,x_3,\cdots,x_{k+1})+R(x_1,x_2,\cdots,x_{k+1})\). 那么

\[\begin{aligned}
\Pr(P=0) &= \Pr(P=0\mid Q=0)\Pr(Q=0)+\Pr(P=0\mid Q\neq 0)\Pr(Q\neq 0)\\
&\le \Pr(Q=0)+\Pr(P=0\mid Q\neq 0)\\
&\le \Pr(Q=0)+\Pr(P(x_1{\color{red}{;}}~x_2,x_3,\cdots,x_{k+1})=0)\\
&\le (d-t)/|F|+t/|F|\\
&= d/|F|.
\end{aligned}
\]
$\square$

  运用引理, 该算法的正确率为 \(\frac{2k-1}{2^w}\), \(w\) 取一个不算大的值就能得到良好的效果.

  构造方案 钦定可行起点集合, 迭代 \(k\) 次算法即可. 复杂度不变.

  \(\textbf{Example 2.}\)

  给定一个无向图 \(G=(V,E)\), 点 \(u\) 有颜色 \(c_u\). 你需要选出一个点集 \(V_0\), 记其在 \(G\) 中的导出子图为 \(G_0\), 则其满足 \(G_0\) 连通且颜色 \(i\) 在 \(V_0\) 中的出现次数 \(\le m_i\). 保证 \(m=\sum_im_i\ll n=|V|\).

  \(\textbf{Solution 2.}\)

  如同上一题, 我们先把原问题转化为判定性问题. 枚举点集的大小 \(k\), 检查是否存在可行的导出子图.

  构造多项式 点集 \(V\) 合法有两个判断要素: 一是连通, 二是颜色出现次数满足限制. 我们的构造性算法更容易描述 "存在某种要素组合", 分别考虑对二者的描述:

  对于连通, 可以通过 "存在生成树" 来描述. 设 \(X_{n\times n}\) 是同上题的随机矩阵, 则对于枚举的有根生成树树边集合 \(E_T\), 其贡献

\[\prod_{\lang u,v\rang\in E_T}X_{uv}.
\]

  对于颜色出现次数限制, 可以通过 "存在一种对点集内结点编号的方法, 使得同色结点编号不同". 这里, 结点 \(u\) 的编号是 \([1,m_{c_u}]\) 内的整数. 而 "编号不同" 就可以使用上题的构造策略了. 我们生成 \(Y_{n\times m}\) 用于编号, \(Z_{m\times m}^{(i)}\) 用于对颜色 \(i\) 的重复编号进行抵消, 那么这部分的贡献为

\[\sum_{\varphi}\prod_{u\in V_T}Y_{u\varphi_u}\sum_{\sigma}\prod_{v\in V_T}Z_{\varphi_v\sigma_v}^{(i)}.
\]

其中 \(\varphi\) 枚举编号方法, \(\sigma\) 枚举对结点的编号排列.

  那么, 一颗固定有根树 \(T=(V_T,E_T)\) 的贡献为

\[\prod_{\lang u,v\rang\in E_T}X_{uv}\sum_{\varphi}\prod_{u\in V_T}Y_{u\varphi_u}\sum_{\sigma}\prod_{v\in V_T}Z^{(i)}_{\varphi_v\sigma_v}.
\]

  求解多项式 同上一题一样, 我们先枚举 \(\sigma\) 的实际值域 \(S\) 并固定. 接下来需要计算的是:

\[\prod_{\lang u,v\rang\in E_T}X_{uv}\prod_{u\in T}\left(\sum_{\varphi}Y_{u\varphi_u}\sum_{\sigma,\sigma_i\in S}Z^{(i)}_{\varphi_u\sigma_u}\right)=\prod_{\lang u,v\rang\in E_T}X_{uv}\prod_{u\in T}W_u.
\]

当然, 特征为 \(2\) 的有限域下, 我们并不需要用诸如状压的手段保证 \(T\) 中结点两两不同. 直接令 \(f(r,s)\) 表示以 \(r\) 为根, 大小为 \(s\) 的有根树的贡献和, 枚举 \(r\) 的一个孩子转移就行. 最终复杂度 \(\mathcal O(2^mm^2|E|w)\).

  正确性分析 和上面一样的嘛.

  构造方案 找到有答案的根 \(r\), 不断加入其邻接边直到出现答案, 此后将这条边的端点与根合并, 更新\(\{m\}\) 集合, 迭代即可. 复杂度不变.

Note - 速通 NPC?有限域算术!的更多相关文章

  1. 【资源分享】半条命2速通AHK脚本

    *----------------------------------------------[下载区]----------------------------------------------* ...

  2. Linux速通 随笔整理

    Linux速通 随笔整理 为了方便阅读,特整理了相关的学习笔记 零.大纲 一.系统安装 二.命令格式 三.文件管理 四.用户群组 五.文件处理 六.系统初始化及监控 七.硬盘初始化 八.网络原理

  3. (数据科学学习手札151)速通pandas2.0新版本干货内容

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,前两天pandas正式发布了其 ...

  4. [数据结构] 大纲 - Stan Zhang 数据结构速通教程

    * 注: 本文/本系列谢绝转载,如有转载,本人有权利追究相应责任. 2019年4月8日 P1.1 链表 Link:https://www.cnblogs.com/yosql473/p/10727471 ...

  5. Linux速通 大纲

    1.Linux操作系统安装及初始化配置(熟悉) 2.Linux操作系统目录组成结构及文件级增删改查操作(重点) 3.Linux操作系统用户.权限管理(重点) 4.开源软件及Linux下软件包的管理(重 ...

  6. Linux速通01 操作系统安装及简介

    操作系统 # a)操作系统的定义:操作系统是一个用来协调.管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间. # 操作系统分为 系统调用接口 和 系统内核 # b)操作系统内核的定义 ...

  7. Linux速通02 命令格式

    命令的格式 # 格式:命令 [选项][参数] * 命令:告诉 Linux操作系统执行什么 * 选项:说明命令运行的方式(可以改变命令的功能).以 "-"字符开始 * 参数:说明命令 ...

  8. Linux速通03 目录文件的浏览、管理和维护

    Linux文件系统的层次结构 # 树状结构:在Linux或Unix操作系统中,所有的文件和目录都被组织成一个以根节点开始的倒置的树状结构. # 目录的定义:目录相当于Windows中的文件夹,目录中存 ...

  9. Linux速通04 用户、群组、权限

    用户及passwd文件 # /etc/passwd文件的功能:存储所有用户的相关信息,实际上是存放用户信息的数据库(database) # 各个字段的含义: * 第一个字段(列)记录的是这个用户的名字 ...

  10. Linux速通05 文件处理与编辑

    使用 cat 命令进行文件的纵向合并 # 例:使用 cat 命令将 baby.age.baby.weight.baby.sex 这三个文件纵向合并为 baby文件 * cat baby.age bab ...

随机推荐

  1. 线性枚举(C语言)

    1.求最大值 比如求一个线性表中的最大值,可以先设定一个最大值,把它初始化为一个非常小的数,然后遍历给定的线性表,将其中的每个元素和目前的最大值比较,如果比它大,则更新这个最大值: 如果比它小,就不做 ...

  2. 改变mysql默认字符集为utf8

    问题:在使用mysql时,使用php插入数据库.查询数据库信息会出现乱码 解决:修改mysql配置文件,在其配置文件中加入一下代码 init_connect='SET collation_connec ...

  3. Python随笔之英雄联盟皮肤、炫彩爬取练习

    翻了网上爬皮肤的帖子,很多都是爬英雄的皮肤,没有获取到炫彩皮肤的文件 以下代码就是先获取所有的英雄id,再拼接成新的链接再遍历 把获取到的数据保存CSV文件到本地 (之前从事过游戏账号交易行业,还有很 ...

  4. 基于surging 的木舟平台如何通过HTTP网络组件接入设备

    一.概述 上篇文章介绍了木舟如何上传模块热部署,那么此篇文章将介绍如何利用HTTP网络组件接入设备,那么有些人会问木舟又是什么,是什么架构为基础,能做什么呢? 木舟 (Kayak) 是什么? 木舟(K ...

  5. 使用sklearn中的Adaboost分类器来实现ORL人脸分类

    使用sklearn中的Adaboost分类器来实现ORL人脸分类 前言:博主上网浏览使用Adaboost实现人脸分类时,发现并没有分类,大部分全都是关于人脸识别检测的,并没有实现对某个人的精准分类(例 ...

  6. 基于常量值提取浅析elf文件结构

    Elf(可执行和可链接文件)是一个永远也绕不开的话题,只要我们还在使用安卓手机/linux服务器,我们就需要了解elf的一些方方面面,现在就让我们从一个常量值提取的小需求出发,逐步解析elf文件结构吧 ...

  7. 精选2款C#/.NET开源且功能强大的网络通信框架

    前言 今天大姚给分享2个C#/.NET开源且功能强大的网络通信框架,希望可以帮助到有需要的同学. NetCoreServer NetCoreServer是一个.NET开源.免费(MIT License ...

  8. 关于开启了auth的站点如何使用curl访问

    有的站点开了 auth 如何访问呢 可以直接这样 将 用户名密码放入URL中 http://username:password@host:8080/index.html 即可.

  9. js+jquery实现贪吃蛇经典小游戏

    项目只使用到了html,css,js,jquery技术点,没有使用游戏框架,下载本地直接双击index.html 运行即可体验游戏效果. 项目展示 进入游戏 游戏开始 游戏暂停 html文件 < ...

  10. php之Opcache深入理解

    PHP项目中,尤其是在高并发大流量的场景中,如何提升PHP的响应时间,是一项十分重要的工作.而Opcache又是优化PHP性能不可缺失的组件,尤其是应用了PHP框架的项目中,作用更是明显. 1. 概述 ...