CF1184A3 Solution
题意:给你两个长度为 \(n\) 的小写字符串 \(s,t\) 和一个 \(m\),定义哈希函数
\[h(s)=\left(\sum_{i=0}^{n-1}s_ir^i\right)\bmod p \]求构造 \((p,r)\) 且 \(p\ge m,r\in[2,p-1]\),使得 \(h(s)=h(t)\)。
\(n,m\le10^5\)。
题目即求一个多项式 \(f(x)=\sum_{i=0}^{n-1}(s_i-t_i)x^i\) 满足 \(f(r)\bmod p=0\)。
考虑一个朴素做法:随便选一个 \(p\),枚举 \(r\) 用多项式多点求值求出所有 \(f(r)\bmod p\),看看它是不是 \(0\)。
如果将 \(r\) 看作在 \([2,p-2]\) 上随机,\(f(r)\) 看作在 \([0,p)\) 上随机,那么对于单个 \(r\),\(f(r)\neq0\) 的概率是 \(1-\frac1 p\)。
那么所有 \(f(r)\) 都不为 \(0\) 的概率是 \((1-\frac1 p)^p\),由于 \(p\) 较大,这个数可以近似为 \(\frac1 e\thickapprox0.36\)。
那么我们多找几个 \(p\) 就基本上可以保证找出 \((r,p)\) 了。
问题是,这个做法是 \(\mathcal O(n\log^2n)\) 的,并且带有大常数,何况我不会任意模数多点求值/嘲讽。
考虑把多项式的规模变小。如果我们能找到 \(d\) 满足 \(r^d\equiv1\pmod p\),多项式的规模就降到了 \(d\)。
这里 \(d\) 显然有 \(d|p-1\)。考虑令 \(r=r_0^{\frac{p-1}d}\),那么 \(r^d\bmod p\) 肯定是 \(1\),只需要满足 \(r_0^{\frac{p-1}d}\bmod p\neq1,p-1\)。
我们考虑从小到大枚举 \(d\),再枚举 \(p\) 满足 \(d|p-1\),随机出满足条件的 \(r_0\) 搞出 \(r\),暴力算 \(f(r)\bmod p\) 的值。
这样子找不到 \(0\) 的概率提升了,变为 \((1-\frac1 d)^d\),但多点求值的复杂度降到了 \(\mathcal O(d\log^2d)\) 或 \(\mathcal O(d^2)\)。
经过测试可以通过(?),复杂度我也不知道是啥
标签:多项式,bmod,cf1184a3,solution,枚举,frac1,求值,mathcal From: https://www.cnblogs.com/iorit/p/18037987