数论
题意简述
给定不含重边的有向图 ,设其邻接矩阵为 ,定义其元素的“加”为逻辑或,“乘”为逻辑与。问 在何时出现循环节(),以及最小循环节长度 (即,, 均最小)。
题意转化
在原图上,从 出发,可用恰 步走到 ,则在 次迭代后的图上有有向边 。问最少迭代多少次后图的形态出现循环节。
强连通图的所有环环长的最大公约数
任意找一点 ,只需考虑经过 的所有环。
考虑有一不经过 的环,其长为 ;另有一经过所有点的环(本图强连通),其长为 。则有 。
我们任意找一棵本图的搜索树。设其根为 。设节点 的深度为 。设某经过 的有限长度的环依次经过了非树边(横叉边、返祖边) 。那么其环长在答案中可以被 取代。
可得 一定是 的祖先。我们删去 ,得到另一个环;这环与原来环的长度差为 。这两环均在答案中作出贡献;又由于 ,则我们将原来的环长等价替换为两个数:其一即 ,其二为现在的环长。再继续删除 ,便等价地换为 个数。
因此我们遍历一遍搜索树,就可以在 的时间内求出所有环环长之 。 (更多…)
我们有非常易于理解的暴力解法:直接对于 ,求出所有可以当作底数的 ,计算 后放入数据结构/排序去重;特别处理 的情况即可。在此不再赘述。
不过,我们注意到若有正整数 ,满足 ,且 (即底数 不可再开根),那么 。这意味着假如不去重地暴力添加 到答案中,上文中 将被算 次。
于是这就变成莫反的模板题了:记 表示“能被 表出的 之数量”, 表示“恰能被 表出,不可被 表出的 的数量”。易得 ,故 。显然,当 时仅有 满足 ,故我们只需计算 个 ,最后特判 。预处理出 的值,暴力求取反演式,复杂度为 。
其实并不需要这么麻烦。我们根本不需要反演:根据 ,假若 都已经计算完成,那么我们直接得到 。由 从大往小计算即可,复杂度相同。
AtCoder Regular Contest 148 D – mod M Game
鲁莽的尝试?
一个非常显然的 Bob 的必胜局面是:对于任意 ,在这 个数中的出现次数均为偶数。由此 Bob 可以选择与 Alice 上一轮选的相同的数而获胜。
那……其他局面就一定是 Alice 必胜么?
我们只依靠该结论交一份代码。不出意料,没有通过。不过它只错了两成的测点!看来大体方向是正确的。
正解
昨晚参与AtCoder ABC 236时认为G题似乎可做,直到看到数据范围才发现事情没有那么简单。
由于最近学习离线数据结构,又见识过一道题意接近的题目,故想到整体二分,二分每一个节点第一次能恰好经过条边到达的时间,然后考虑DP求解。设计状态表示在该图上经过恰好次转移能否到达点。但很快发现每一次二分时均要重新在图上运行DP,时间复杂度无法承受。况且DP递推转移的次数高达,甚至不可能是线性的复杂度。
今天查看题解,发现有几个重要的,从未考虑过的trick:
- 既然要求能够经恰好次转移到达的最早的时间点,则我们将每条边的边权设为其加入图中的时间,则可以转化成恰有条边的最小瓶颈路。
- 发现很大,所以考虑通过矩阵乘法加速递推,也即所谓倍增优化DP的一种。