卷积

未完工,敬请期待。

2025/06/01 00:00:00

网络流

前言 首先,网络流不是一个算法,而是一个整合包(玩MC玩的),说白了就是网络流是多个算法的统称: 最大流 EK Dinic 最小割 费用流 … 而且,有些不常用的,可能就不会提,粘个OI Wiki的链接就不详细写了。 接下来就按照这个目录挨个讲一下每个算法。 最大流 如果有哪里没有说清楚,可以看这里,里面还有我没有说到的最大流类型。 看到最大流这个名字很多人都很陌生,这里就先从定义说起。 定义 还是拆词法,“网络流”就可以大致理解为“网络”上的“流”,接下来就挨个说一下这两个的定义。 网络 先说网络的定义。(当然不是Internet) 我们在理解的时候可以认为是管道,但实际上它是一张特殊的有向图。 建设管道的必然知道,管道内流过的水,准确来说是单位时间内流过的水,必然是有上限限制的,否则管道就炸了。 这里也一样,对于每条边 $x \to y$,都有一个函数 $c(x,y)$ 表示这条边的限制,又称容量。 如果在图上没有这条边,则统一规定 $c(x,y)=0$。 最后,还是跟最短路一样,它有一个起点和一个终点,又称源点 $S$ 和汇点 $T$($S \not= T$)。 流函数 再说流函数。 流函数就是说,在真实操作中,一个单位时间内一条边 $x \to y$ 流过的水量 $f(x,y)$。 这里默认保证每个单位时间内都得流过这么多。 其实很好理解。 流函数性质 顺便说一下流函数要满足的性质。 首先,源点可以无限输出水,汇点可以无限输入水。 接下来就是一堆性质: 对于每个 $x,y$,显然 $f(x,y) \leq c(x,y)$(容量限制)。 对于每个 $x,y$,$f(x,y)=-f(y,x)$(斜对称)。 对于每个 $x$,满足不是源点也不是汇点,$\sum\limits_{u \to x} f(u,x)=\sum\limits_{x \to v} f(x,v)$(流量守恒)。 这里说一下最后一点性质。 ...

2025/05/30 20:56:39

BSGS算法

basic BSGS算法英文名叫“baby-step giant-step”,又称“大步小步算法”。 这个算法听名字似乎是个随机化算法,但实际上是数论算法。 具体地,这个算法解决的是 $a^x \equiv b \pmod{p}$ 的解,其中 $a$、$b$、$p$ 是已知的($0 \leq a,b<p$,保证 $\gcd(a,p)=1$),$x$ 是要求的。 这个算法甚至可以求出所有的 $x$,但为了好讲,我们先考虑如何求出是否有解,以下代码中YES就代表确定有解了。 force algorithm 首先,有一个暴力算法: rep(x, 0, INF) if(ksm(a, x, p) == b) YES 但这个算法是 $O(\infty)$ 的,我们考虑优化。 optimization algorithm 1 我们考虑 $x$ 的上界,根据欧拉定理,$a^{\varphi(p)} \equiv 1 \pmod{p}$,我们就可以确定,$x$ 的上界就是 $\varphi(p)$(准确来说减 $1$ 也彳亍),因为如果 $x>\varphi(p)$,那么 $a^x$ 就等于 $a^{x-\varphi(p)}$,也就成为了一个循环,所以上界就是 $\varphi(p)$。 由于 $\varphi(p)<p$,所以可以把 $p$ 当做是质数,$x$ 的上界也就是 $p-1$ 了。 所以: rep(x, 0, p - 1) if(ksm(a, x, p) == b) YES optimization algorithm 2 (BSGS) 但这个算法还是可能会TLE,我们继续考虑优化 我们定义 $q=\left\lceil \sqrt{p} \right\rceil$,那么我们其实就可以把 $x$ 表示为 $q$ 进制下的两位数,具体地,我们把 $x$ 表示为了 $Aq+B$($0 \leq A,B<q$),然后上述公式就可以化成 $a^{Aq+B} \equiv b \pmod{p}$,即 $a^{Aq} \times a^B \equiv b \pmod{p}$。 ...

2025/04/21 22:58:14

阶和原根

按照正常的思路我们都直接讲算法,但这会先讲一道题,然后再讲它的定义和求法。 参考: ABC335G题解 阶和原根 背景 是一场ABC335里的G题,当时在赛场上大概留了一个多小时的时间,但一直都在想用BSGS,但显然最后没想出来。 而这题的瓶颈就在下面问题: 对于两个数 $a,b$,是否存在一个 $x$ 使得同余方程 $a^x \equiv b \pmod p$ 有解。 $a,b,p \leq 10^{13}$(原题数据范围) 大家看到的第一眼显然可以用BSGS求。 但这个算法是 $O(\sqrt p)$ 的(如果涉及到具体实现的话,可能还得乘个 $\log \sqrt p$,就是set、lower_bound查找的复杂度),比较适用于单组询问,很难推广应用。 所以还有另外一种方式,比较适用于多组询问。 是我们求出来 $a$ 和 $b$ 的阶,即 $\text{ord}_p a$ 和 $\text{ord}_p b$,看 $\text{ord}_p b$ 是否是 $\text{ord}_p a$ 的因子($\text{ord}_p b \mid \text{ord}_p a$)即可。 这里先不证这个结论是否正确,但相信大家第一次看到“阶”的时候定然是一头雾水的,下面我就来说一下它的定义和求法。 定义 阶 阶的话,跟逆元相似,还是需要两个值,只不过这里叫做“$a$ 在模 $p$ 意义下的阶”而已,换汤不换料。 这个表示方法就是 $\text{ord}_p a$。 它的定义是: 给你整数 $a$、$p$。 找到最小的 $x$,使得同余方程 $a^x \equiv 1 \pmod p$ 成立。 这个 $x$,就是 $a$ 在模 $p$ 意义下的阶。 原根 但说到阶,我们定要讲一下它的孪生兄弟,原根了。 ...

2025/04/21 22:44:20

Lucas定理

(以下全部假设 $C_n^m$ 中的 $n$ 和 $m$ 都很大,最大能达到 $10^{18}$) Lucas定理 Lucas定理往往用于求组合数的结果且模数较小的题目。 其实定理很简单,也很好记,$\Large C_n^m=C_{\lfloor \frac{n}{p} \rfloor}^{\lfloor \frac{m}{p} \rfloor} \times \color{orange} C_{n \bmod p}^{m \bmod p}$,在 $p$ 为质数的条件成立。 上面之所以强调模数较小,是因为我们需要通过预处理阶乘的方式去求橙色项的值。 代码实现很简单,此处略。 但有个注意点,在我的代码模板里,由于求facny数组是递推求出的,而不是每个分别去用getny求出的,所以调用init函数时,传参应该是MOD-1而不是MOD。 exLucas定理 (前方高能) 这个定理还是解决求 $C_n^m \bmod p$ 的值的问题,$p$ 仍然很小,但不保证是质数。 根据M2579的做法,我们可以考虑对 $p$ 做一个唯一分解,分解成 ${p_1}^{a_1} \times {p_2}^{a_2} \times {p_3}^{a_3} \times \dots \times {p_k}^{a_k}$。 然后,分别求出 $C_n^m \bmod {p_1}^{a_1}$ 的值、$C_n^m \bmod {p_2}^{a_2}$ 的值、$C_n^m \bmod {p_3}^{a_3}$ 的值、…、$C_n^m \bmod {p_k}^{a_k}$ 的值,然后就可以用CRT求出 $C_n^m \bmod p$ 的值了。 在M2579内,$p$ 唯一分解后,每个 $a_i$ 都等于 $1$,所以直接用Lucas定理就可以求,但在一般的题目中,指数不一定都等于 $1$,所以才要用到exLucas定理。 ...

2025/04/21 21:17:58

【娱乐】florr.io更新快报

需要更早的更新或需要修正请联系我。 一些无关紧要的更新不会写,部分更新会加上个人看法。 初来建议从下往上读,下面的一些专有名词在上面不做解释。 有时候会修改下面更新的某些内容,我会用加粗标出来。 【20250401】杂项更新 生物战利品调整: Beetle(沙漠甲虫)掉落物Ankh(安卡)改为Privet(硬币女贞子)。 Soldier Termite(白兵蚁)掉落物Privet(硬币女贞子)改为Triangle(三角形)。 花朵: 玩家全部名称形象改为M28(估摸着限时 【20250331】三角形更新 更新新花瓣Triangle(三角形)。 外观是一个略微倾斜的三角形,伤害为 $\dfrac{D}{3}$,耐久为 $H$。 可以由Soldier Termite掉落,掉率应该和之前Bone掉率一样,算正常。 特殊效果是每多装备一个三角形,每个三角形都可以加相当于其原本伤害 $0.8$ 倍的伤害,装备 $3$ 个每个都可以加 $2$ 倍,以此类推。 冷却是 $2s$,比大多数花瓣短。 经过我一通猛算,发现无论带多少个Triangle,单个伤害都无法达到高等级硬币伤害。 并且如果带 $9$ 个Triangle $+$ $1$ 个Faster,会比 $8+2$ 的DPS略大,如果你把转速天赋点满的话。反正全青Triangle抢不到Super就是真理。 【20250318】沙漠新区更新 从沙漠出生点附近的竖直道延伸出一个区域,外观为一个金字塔(据猜测是新地图的入口,暂时不能进去),其门口会低频刷低级(绝大多数为Common、Unusual)木乃伊甲虫。 据说如果门口有 $200$ 人新区域就会开放。 更多信息敬请期待。 现在已经开放,具体信息未知。 【20250316】绷带更新 更新新花瓣Bandage(绷带,忘了啥意思的建议重学八下英语)。 外观是一个被绷带缠绕着的球,没有伤害、耐久、冷却(有点像Antennae等显示在花朵表面的花瓣)。 可以由木乃伊甲虫掉落,掉率与火蚁掉落骨头一样,最低稀有度Mythic,其他掉落和同级甲虫完全一样,极其稀有(猜测和邪眼甲虫一样的生成概率)。 20250318更新:木乃伊甲虫掉落改变,bgg(Bettle Egg)掉率极低,Ankh掉率高。 其作用是在花朵濒死的时候触发,可以让花朵无敌一段时间,无敌时间结束后必死(暂不确定若此时有剩余血量是否仍然会被击杀),且在一段时间内无法被ygg。 因为维基还没更新,目前暂不知道其具体数据,这也是我咕这么久的原因之一。 【20250308】骨牌更新 更新新花瓣Domino(音译“多米诺”,即骨牌)。 我们统一把一个等级Coin的伤害、耐久为同等级的标准伤害、耐久,表示为 $D$、$H$。 外观类似两个Dice的结合,伤害为 $\dfrac{D}{15}$,耐久为 $H$。 可以由Centipede (Hel)掉落,掉率低的离谱,和原本它掉落Chip掉率是一样的。 每次Reload后随机上下两片的点数,其上下两片点数之积即为伤害倍率,最高可造成 $6 \times 6=36$ 倍伤害,冷却 $2s$(不是 $2.5s$)。 以下是数学方法计算该花瓣的强度以及和其他花瓣的对比: 下面统一忽略florr判定伤害的时长 $0.04s$,也就是实际上每 $0.04s$ 才会执行一次伤害判定,但有些时候(如计算Corn的时候)因为造成伤害次数过多会算上。 ...

2025/04/10 20:52:32

斜率优化

参考资料: Boyacoding OI Wiki 以下学习笔记为25.3.27重制版。 引入 我们先以一道题P3195 玩具装箱为例。 大概说一下题意: 我们要把一个长度为 $n$ 的数组 $a$ 分成若干段。 设一段为 $a_{l..r}$,那么其“长度”为 $r-l+\sum\limits_{i=l}^r a_i$,下面简称为 $len$。 那么这一段的“代价”为 $(len-L)^2$,$L$ 是题目中给的定值。 最后的总代价为每一段的代价的和,问最小的总代价。 暴力DP 根据题目我们能很容易设计出一个一维DP,$d_i$ 表示 $a_{1..i}$ 的划分方案最小代价,且最后一段结束位置为 $i$。 那么 $d_i=\min{d_j+w(j+1,i)}$,其中 $w(l,r)$ 为 $[l,r]$ 的代价。 转化 设 $s$ 为 $a$ 数组的前缀和,同时下面统一省略掉 $\min$,因为关于求最小值最大值只在最后一步出现。 展开之后也就是: $$d_i=d_j+(i-j-1+s_i-s_j-L)^2$$ 把括号内的东西改成只和 $i$、$j$ 相关的两部分,也就是: $$d_i=d_j+((i+s_i)-(j+1+s_j+L))^2$$ 那么我们可以设前半部分为 $a_i$,后半部分为 $b_j$,也就是: $$d_i=d_j+(a_i-b_j)^2$$ 展开: $$d_i=d_j+a_i^2+b_j^2-2a_ib_j$$ 逼近斜率优化 接下来关键的一步来了,我们考虑把上述式子移个项: $$d_j+b_j^2=2a_ib_j+d_i-a_i^2$$ 显然上面这个式子的先后顺序是我故意排的,那么我们一眼丁真一下,设: $y_j=d_j+b_j^2$ $x_j=b_j$ $k_i=2a_i$ $b_i=d_i-a_i^2$ 那么上式可以变成: ...

2025/03/27 23:42:58

【娱乐】《星际穿越》电影解说

前言 这部电影可以说是当之无愧的科幻电影中的第一名,没有之一。 如果有朋友喜欢看科幻电影,我一定会推荐这部片子。 下面我将为你解说这部电影,并分析它到底好在哪里。 话不多说,我们直接开始。 注:下面假设你已经至少看过一遍该电影,所以部分易懂的情节就不会说了。 角色&名字对照 男主角(宇航员&家长):约瑟夫·库珀(简称“库珀”) 女主角(宇航员):艾米莉亚·布兰德(简称“布兰德”) 男主角的女儿(幼年&成年&老年):墨菲·库珀(简称“墨菲”) 女主角的父亲(教授):约翰·布兰德(简称“布兰德教授”) 第一个星球上在巨浪中身亡(宇航员):道尔 第二个星球上在爆炸中身亡(宇航员):罗米利 男主角的儿子(幼年&成年):汤姆·库珀(简称“汤姆”,跑龙套) 开头 电影一开头播放了一些口齿有些不清的老人的录音,根据内容可以推断出,在未来地球早已不宜居。 记住这些录音,在后面还会提到。 之后是主角的家里,可以发现当时几乎所有的作物都已经灭绝,注意是灭绝,包括小麦在内。 此时唯一幸存的就是玉米。 之后又放了一段校内让库珀去参加家长会的场景,有些人可能对此不管,但这里埋了几个伏笔: 墨菲在校内的成绩不太好。 墨菲在校内传一本关于阿波罗登月的书籍。 至于在之后哪里照应,我先卖个关子,我们继续。 发展 在看球赛的时候突然一场沙尘暴刮来,在回到墨菲房间的时候突然出现了一个非常奇幻的景象——沙子开始以反重力的形式下落。 墨菲称此为“幽灵”,随后在当晚去了汤姆的房间。 次日,库珀通过在地上沙子的厚薄用二进制(binary)的形式分析出了一个数字——$33$。 随后他便驾车顺着地图前往了那个位置,发车前女儿还混上车了。 到了位置之后,库珀尝试用老虎钳打开铁门,但是被抓了个现行。 随后画面一闪便到了他被一个机器人审问的场景。 机器人名叫TARS(塔斯),这个在后面会发挥大作用。 辗转之后有一个很小的场景,就是说玉米也被blight(枯萎病)所影响,不久也会灭绝,到时候地球将彻底不适合生命体生存。 显然执行所谓的A、B计划刻不容缓,所以库珀便到了家里对墨菲做了最后的告别。 在这段内,库珀给了墨菲一块手表,说“等到我(库珀)回来的时候,也许你(墨菲)会和我一样大”。 在此时,墨菲也说墙上的书经常倒下,根据这个破译出来的摩斯密码写着“STAY(留下)”。 但最终还是没能留住库珀。 航行 一段剪辑之后,库珀驾驶飞船升空。 虫洞 他们根据预定的路线来到了土星旁边的虫洞,根据前文,这是“they(他们)”放的,记住这个单词,之后会多次提到。 显然这个虫洞是有人在帮助当时的人类,以更快达到其他的星系。 这里的虫洞场景其实是根据现代的科学能够证实的,这也是剧组细心的一处。 在虫洞内有一个细节可能大家不会在意,就是此时女主把手伸到了窗户旁边,然后手扭曲了。 她称此为“handshake(握手)”。 在之后还会提到这次握手。 第一个星球 经过一段讨论后航行组去了第一个星球,在此提到了一个非常惊人的数据——“因为离黑洞太近了,所以在星球上的一个小时相当于地球上的七年”。 我大概算了一下,相当于时间变慢了六万倍,过一秒地球上就过去了十七个小时。 于是他们便派了男主、女主、道尔去上面。 到了星球发现全是水。 在这上面他们尝试找到发送的数据,但最后因为大浪袭来,道尔没来得及上飞船,在巨浪中身亡。 也因为这个大浪,最后过了一个小时才把引擎的水排完,最后安全回到母舰。 到了母舰上发现时间已经过去了几十年。 争论 但其实这些都是小事,最重要的是,此时他们燃料已经不足,剩下两个星球只能去一个。 而此时男主和罗米利都同意去一直在发送消息的星球A,女主要去已经杳无音讯的星球B。 最后少数服从多数,去了星球A。 第二个星球 到了这个星球后发现有冻云,顾名思义可以发现这里特别冷。 之后根据在这个星球上休眠的人(下称C)所说,这个星球的空气也不适合人类呼吸,但在下面存在氧气。 但辗转几番发现,其实C说的都是骗人的,他的实际目的是为了把库珀骗走杀了,然后在基地内引爆炸弹把剩下两人杀了,最后自己一个人乘飞船逃走。 正如他说的“但我知道,我只要按下那个按钮(应该指的是发送数据的按钮),就一定会有人来救我”。 最后库珀拿到了通信器,女主去救库珀躲过一劫,罗米利则不幸遇难。 此处可见人性的险恶,但显然TARS发现的比其他人早。 最后C没有和永恒号对接上而爆炸。 男主在经过一段时间相对静止的对接后成功让永恒号远离星球A的大气层。 真相大白 在这段时间内有个插曲,就是布兰德教授去世了。 在去世之前,他给墨菲说了事件的真相,其实A计划根本不存在,他们出去了大概就再也回不来了,实际上只有B计划。 他制造A计划是为了让那些人为了拯救自己的家人而行动,激发他们的行动力。 ...

2025/03/16 21:12:37

莫队算法

普通莫队算法 概览 莫队其实是分块的变化版,没有完全分块。 但莫队的题目一般比分块的题目比较好看一些,其中的“好看”指的是很好看出这是个莫队/分块的题。 接下来说一下莫队能解决的题型。 解决题型 莫队一般解决以下问题: 给你一些信息,和 $q$ 次询问,每次询问可以抽象为一个区间。 而且这个问题还要满足一些条件: 可以离线 不能有修改(当然带修莫队支持修改,不过普通莫队就不行了) 从 $[l,r]$ 的答案可以很快转移到 $[l-1,r]$、$[l+1,r]$、$[l,r-1]$、$[l,r+1]$ 的答案 解决方法 这种题型有个解决方法。 还是先从暴力说起。 暴力做法 看见这个问题的最后一个条件没?这个条件就启发我们从第一个问题的答案,暴力调整左、右端点,去得到第二个问题的答案,以此类推。 这种暴力做法的复杂度一般为 $O($ 任意相邻两个问题的左、右端点差之和 $)$。 而这个算法可以用一种数据卡掉: 左、右端点的值的最大值 $n$ 调到最大,把询问次数 $q$ 也调到最大。 然后的 $q$ 次询问里,交替询问 $1 \sim n$ 和 $n \sim n$。 于是,复杂度被卡到 $O(qn)$。 一次优化 这个做法的复杂度是无法接受的,所以我们考虑优化。 我们不如把所有询问离线,然后考虑交换询问处理的顺序以减少复杂度。 一种方式就是把左、右端点分别作为第一、二关键字,然后做排序。 但这样就会被排序后所有询问的右端点一大一小的数据卡到 $O(qn)$ 的复杂度。 二次优化 这样排序还是不好,还是会被卡掉,于是我们考虑变换比较函数。 直接双关键字比较不好,那我们就分块后进行双关键字比较。 具体地,遇到两个询问,先按左端点所属块编号从小到大排序,如果相同,则按右端点(不是所属块编号,是原本的下标)从小到大排序。 这样的话,复杂度就是 $O(n \sqrt n+q \sqrt n)$ 的复杂度了。 ...

2025/03/06 21:26:37

20250211代码源比赛

赛时记录 比赛一开始($11$ 分钟)就过了A。 后来一直在B题思考正解。 在比赛达到 $2h$ 之后,我发现正解已经没希望了,结论假了。 所以改成了暴力。 事实上我先写的C,因为感觉B不太有希望,C一眼 $20$ 分。 之后回头看B,干了最低档。 最后是D,思考了一下可以做 $45$ 分,搞了。 此时里比赛结束还有 $27$ 分钟,所以回头看了一下,发现C题的暴力很多。 先后搞了子任务 $1 \sim 3$,总共 $70$ 分。 然后比赛就结束了。 估分 VS 结果 估分:$100+10+70+45=225$ 结果:$100+25+0+30=155$ 挂分原因 关于B为啥多了 $15$ 分,我也不知道。 C很复杂: 子任务1 $T \leq 100,n \leq 10$ 挂了:赋值消耗时间复杂度太多,在swap的时候回溯写挂了。 子任务2 $k=0$ 挂了:赋值消耗时间复杂度太多。 子任务3 $k=1$ 挂了:做法假了 D: 子任务3 $T=1,k \leq 15$ 挂了:实现的时候没有预处理 $s$、$e$ 的答案,导致询问次数太多TLE。 策略 感觉还是卡B太久。 事实上这次A非常确信做法正确,事实就是正确的,但后面的题没有对拍,导致总共挂了 $85$ 分。 之后无论对于正解还是暴力都得对拍,如果认为有挂的概率的那种。

2025/02/11 21:49:00