cf1184a3-solution

CF1184A3 Solution

link

题意:给你两个长度为 \(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)\)

经过测试可以通过(?),复杂度我也不知道是啥

posted @ 2024-02-27 20:21  iorit  阅读(8)  评论(0)    收藏  举报