记录:
虚树
BSGS
求解满足 ax≡b(modp) 的最小 x ( p 是质数)
Bézout定理
欧拉函数习题
斜率优化
-
写出 dp 方程后,要先判断能不能使用斜优,即是否存在 function(i)∗function(j)
的项或者 X(j)−X(j′)Y(j)−Y(j′) 的形式。 -
通过大小于符号或者 b 中 dp[i] 的符号结合题目要求 (min/max)
判断是上凸包还是下凸包,不要见一个方程就直接盲猜一个下凸。 -
当 X(j) 非严格递增时,在求斜率时可能会出现 X(j1)=X(j2)的情况,此时最好是写成这样的形式:
return Y(j)>=Y(i)?inf:-inf
,而不要直接返回 inf 或者−inf,在某些题中情况较复杂,如果不小心画错了图,返回了一个错误的极值就完了,而且这种错误只用简单数据还很难查出来。 -
注意比较 k0[i] 和 slope(j1,j2) 要写规范,要用右边的点减去左边的点进行计算(结合 (3)来看,可防止返回错误的极值),如果用的代数法理解,写出了
(X(j2)-X(j1))*k0<=Y(j2)-Y(j1)
或(X(j2)-X(j1))*k0<=Y(j2)-Y(j1)
,而恰巧 j1,j2又写反了,便会出现等式两边同除了负数却没变号的情况。当然用 k0 和 X(j2)−X(j1)Y(j2)−Y(j1) 进行比较是没有这种问题的。 -
队列初始化大多都要塞入一个点 P(0),比如 玩具装箱 toy,需要塞入P(S[0],dp[0]+(S[0]+L)2) 即 P(0,0),其代表的决策点为 j=0。
-
手写队列的初始化是
h=1,t=0
,由于塞了初始点导致 t 加 1,所以在一些题解中可以看到h=t=1
甚至是h=t=0
,h=t=2
之类的写法,其实是因为省去了塞初始点的代码。它们都是等价的。 -
手写队列判断不为空的条件是
h<=t
,而出入队判断都需要有至少 2 两个元素才能进行操作。所以应是h<t
。 -
计算斜率可能会因为向下取整而出现误差,所以 slope 函数最好设为 long double 类型。
-
可能会有一部分的 dp 初始值无法转移过来,需要手动提前弄一下,例如 摆渡车
[P5017]。 -
在比较两个斜率时,尽量写上等于,即 <= 和 >= 而不是 < 和 >。这样写对于去重有奇效(有重点时会导致斜率分母出锅),但不要以为这样就可以完全去重,因为要考虑的情况可能会非常复杂,所以还是推荐加上 3 中提到的特判,确保万无一失。
(题单)
1 | 玩具装箱 toy [HNOI2008] [P3195] |
欧拉函数结论
-
∀n>1 ,1 ~ n中与 n 互质的数的和为 21n×φ(n)
证明:gcd(n,x)=gcd(n,n−x),所以与 n 互质的数成对出现,平均数为 n/2 。
-
若 p 为素数, φ(pk)=pk(1−p1)=pk−1(p−1)
-
φ(n)=n(1−p11)(1−p21)…(1−pk1)
证明:容斥