Note - 速通 NPC?有限域算术!
- 浅谈有限域在 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\), 我们将它的权值乘上
\]
其中 \(S_k\) 是全局 \(k\) 阶置换集合. 可以感受到, 当 \(v_i\) 两两不同时, 上式 "很大概率" 非 \(0\); 而当 \(v_i=v_j~(i\neq j)\) 时, 上式显然为 \(0\).
最后, 我们就是要求出
\]
构造过程到此为止, 接下来我们只需要计算这个结果就行.
求解多项式 比较自然的想法: 对 \(\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)\) 的空间复杂度优化到线性. 利用容斥处理集合状态:
\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})\). 那么
\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}
\]
运用引理, 该算法的正确率为 \(\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\), 其贡献
\]
对于颜色出现次数限制, 可以通过 "存在一种对点集内结点编号的方法, 使得同色结点编号不同". 这里, 结点 \(u\) 的编号是 \([1,m_{c_u}]\) 内的整数. 而 "编号不同" 就可以使用上题的构造策略了. 我们生成 \(Y_{n\times m}\) 用于编号, \(Z_{m\times m}^{(i)}\) 用于对颜色 \(i\) 的重复编号进行抵消, 那么这部分的贡献为
\]
其中 \(\varphi\) 枚举编号方法, \(\sigma\) 枚举对结点的编号排列.
那么, 一颗固定有根树 \(T=(V_T,E_T)\) 的贡献为
\]
求解多项式 同上一题一样, 我们先枚举 \(\sigma\) 的实际值域 \(S\) 并固定. 接下来需要计算的是:
\]
当然, 特征为 \(2\) 的有限域下, 我们并不需要用诸如状压的手段保证 \(T\) 中结点两两不同. 直接令 \(f(r,s)\) 表示以 \(r\) 为根, 大小为 \(s\) 的有根树的贡献和, 枚举 \(r\) 的一个孩子转移就行. 最终复杂度 \(\mathcal O(2^mm^2|E|w)\).
正确性分析 和上面一样的嘛.
构造方案 找到有答案的根 \(r\), 不断加入其邻接边直到出现答案, 此后将这条边的端点与根合并, 更新\(\{m\}\) 集合, 迭代即可. 复杂度不变.
Note - 速通 NPC?有限域算术!的更多相关文章
- 【资源分享】半条命2速通AHK脚本
*----------------------------------------------[下载区]----------------------------------------------* ...
- Linux速通 随笔整理
Linux速通 随笔整理 为了方便阅读,特整理了相关的学习笔记 零.大纲 一.系统安装 二.命令格式 三.文件管理 四.用户群组 五.文件处理 六.系统初始化及监控 七.硬盘初始化 八.网络原理
- (数据科学学习手札151)速通pandas2.0新版本干货内容
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,前两天pandas正式发布了其 ...
- [数据结构] 大纲 - Stan Zhang 数据结构速通教程
* 注: 本文/本系列谢绝转载,如有转载,本人有权利追究相应责任. 2019年4月8日 P1.1 链表 Link:https://www.cnblogs.com/yosql473/p/10727471 ...
- Linux速通 大纲
1.Linux操作系统安装及初始化配置(熟悉) 2.Linux操作系统目录组成结构及文件级增删改查操作(重点) 3.Linux操作系统用户.权限管理(重点) 4.开源软件及Linux下软件包的管理(重 ...
- Linux速通01 操作系统安装及简介
操作系统 # a)操作系统的定义:操作系统是一个用来协调.管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间. # 操作系统分为 系统调用接口 和 系统内核 # b)操作系统内核的定义 ...
- Linux速通02 命令格式
命令的格式 # 格式:命令 [选项][参数] * 命令:告诉 Linux操作系统执行什么 * 选项:说明命令运行的方式(可以改变命令的功能).以 "-"字符开始 * 参数:说明命令 ...
- Linux速通03 目录文件的浏览、管理和维护
Linux文件系统的层次结构 # 树状结构:在Linux或Unix操作系统中,所有的文件和目录都被组织成一个以根节点开始的倒置的树状结构. # 目录的定义:目录相当于Windows中的文件夹,目录中存 ...
- Linux速通04 用户、群组、权限
用户及passwd文件 # /etc/passwd文件的功能:存储所有用户的相关信息,实际上是存放用户信息的数据库(database) # 各个字段的含义: * 第一个字段(列)记录的是这个用户的名字 ...
- Linux速通05 文件处理与编辑
使用 cat 命令进行文件的纵向合并 # 例:使用 cat 命令将 baby.age.baby.weight.baby.sex 这三个文件纵向合并为 baby文件 * cat baby.age bab ...
随机推荐
- Google Guice 与 Noear Solon 的简单对照
1. 简介 Google Guice 是一个轻量级的依赖注入框架,它支持Java 5或者更高版本的JDK.Noear Solon 也是一个轻量级的依赖注入框架,它支持Java 8或者更高版本的JDK ...
- 人形机器人是未来?6只手臂加AI模型,异形机器人重塑种植业。
图源:reddit user IlustriousTea 近日,一则视频在媒体上引起了人们的讨论.国外一处苹果园里,机械嗡鸣声中,六只机械手熟练且快速地采摘成熟的苹果. 这是2018年于美国加利福尼亚 ...
- MongoDB聚合类操作
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*) 语法:db.tablename.aggregat ...
- Gitlab的基本操作
Gitlab的基本操作 Gitlab添加组 添加组建组有多个项目分支,可以将开发添加到组里面进行设置权限, 不同的组就是公司不同的开发项目或者服务模块,不同的组添加不同的开发即可实现对开发设置权限的 ...
- dateFormater:格式化时间
function dateFormater(formater, t){ let date = t ? new Date(t) : new Date(), Y = date.getFullYear() ...
- Solon MVC 的 @Mapping 用法说明
在 Solon Mvc 里,@Mapping 注解一般是配合 @Controller 和 @Remoting,作请求路径映射用的.且,只支持加在 public 函数 或 类上. 1.注解属性 属性 说 ...
- atcoder ABC237-E Skiing
atcoder ABC237-E Skiing 传送门 这题把一个点到另外一个点的开心值变为这条边的权值,就可以化为求最大路.因为有负边权,所以要用\(SPFA\),但\(SPFA\)这玄学的时间复杂 ...
- MyBatis源码研究-缓存
在学习Hibernate中,经常有看到一级缓存和二级缓存的概念,并且有了解到,一级缓存是session级别的缓存一般缓存在内存中,二级缓存是指sessionfactory级别的缓存,一般缓存在内存或者 ...
- SAX,DOM,JAXP,JDOM,DOM4J比较分析
第一:首先介绍一下SAX,DOM,JAXP,JDOM,DOM4J的基本知识:(注意:至于 JAXP JAXB JAXM JAXR JAX-RPC 分别指什么,查看http://gceclub.sun. ...
- Redis可视化管理工具之Redislive
RedisLive是一款用Python编写基于WEB的Redis图形监控工具,也是一款实时监控Redis数据的开源软件,以WEB的形式展现出redis中的key的情况,实例数据等信息. RedisLi ...