一些随机化技巧

异或哈希

常用于快速判断两个集合是否相等。

给每种元素设置一个随机的 unsigned long long 哈希值,每个集合的哈希值是其元素的哈希值的异或和。

例题:

Schwartz-Zippel 定理

对于一个域 FF(通常为 modp\text{mod}\, p 域,其中 pp 为大质数)下的 mmnn 次多项式 f(x1,x2,,xm)f(x_1,x_2,\dots,x_m),若每个 xix_i 均在 FF 中独立等概率随机,则 f(x1,x2,,xm)=0f(x_1,x_2,\dots,x_m)=0 的概率 nF\le \frac{n}{|F|}

感性理解,一元的情况下 ffnn 个根,显然。

这个东西十分实用,常用于检验各种东西是否为 00(例如通过行列式快速检验积和式是否为 00)。

例题:

最大团的经典随机算法

随机一个加点顺序,按照这个顺序加点。若加进去后还是团则加进去,否则不加。这个东西实际上很难卡。

出现次数大于一半,每次随机化可以缩小一半错误率

例题:CF364D Ghd

题解

至少一半的数的因数,这启发我们想到随机化。

具体的,每次随机一个 ii,那么 aia_i 出现在是答案的倍数的集合中的概率是 12\frac{1}{2},枚举 aia_i 的每一个因子作为答案判断是否可行,如可行则贡献给全局答案。

单次时间复杂度 O(106)O(10^6),随机 1010 次可将错误率缩减到 11024\frac{1}{1024},如果不是特别脸黑就可以通过本题。

练习:CF1305F Kuroni and the Punishment

颜色随机映射

处理类似于颜色两两不同的限制时,可以选取一个较小的 mm 并将颜色随机映射到 [1,m][1,m],这样假设需要有 kk 个两两不同的颜色则正确率是 m!(mk)!mk\frac{m!}{(m-k)!m^k} 的。

例题:CF2003F Turtle and Three Sequences