(text{ABC 238 G})
题意
给定一个序列 (a),和 (q) 次询问,每次询问询问是否有
[exists k in mathbb N, prod_{i=l}^r a_i = k^3 ]
非正解
显然可以对 (a_i) 进行质因数分解,并预处理出每个质因数的前缀和,则可以在 (mathcal O(n^{1.5} + q times dfrac {a}{ln a})) 的时间内暴力解决。
注意到做的前缀和相当于三进制不进位加法,则定义 (A_i) 为 (A) 中三进制位为 (i) 的位编号的集合,
则会有
,(tt bitset) 优化即可,时间复杂度:(mathcal O(n^{1.5} + q times dfrac {a}{omega ln a})),其中 (omega approx 10)。
题解
考虑用哈希函数解决本题。如果存在一个函数 (f(x) : mathbb N^{mathcal O(a/ln a)} to mathbb N)(输入实际上是质因数分解),满足 (f(a + b) = f(a) + f(b)),且存在一个性质 (P(x)),使得 (P(f(x))) 是 (x) 对应的整数是立方数的必要条件,就称 (f) 是一个哈希函数。
于是,对于任意的 ({x_i}),有
是哈希函数。
证明:
(P(k) iff 3 mid k):如果 (a) 对应的整数是立方数,则有 (forall i, 3 mid a_i),此时,(f(a)) 的每一项都 (equiv 0 pmod 3),故成立。
线性性成立:
。
我们来分析哈希函数的正确率:
对于一个如上构造的哈希函数 (f),设一个区间是立方数的概率为 (p),则有
概率表 | 是立方数 | 非立方数 |
---|---|---|
预测正确 | (p) | (dfrac 23) |
预测错误 | (0) | (dfrac 13-p) |
,准确率 = (dfrac{{准确预测}}{{总预测}} = p + dfrac 23 ge dfrac 23),失误率 (le dfrac 13),就定义最高失误率 (l := dfrac 13)。
设我们有 (h) 个哈希函数,则 (h) 个哈希函数都失误的概率为 (l^h),定义 (L := l^h)。因为我们有 (Q) 次询问,则至少有一个哈希函数失误的概率为 (1 - (1 - L)^Q),我们将证明这个柿子 (le QL):
数学归纳法:
- (Q = 1) 时左 (= 1 - (1 - L) = L),右 (= 1L = L)(总不可能零次询问吧)
- (Q gt 1) 时:
进行移项,化为 ((1 - L)^Q ge 1 - QL),进行变换:
(begin{array}{l} (1 - L)^Q ge 1 - QL \ (1 - L)^{Q - 1} (1 - L) ge 1 - QL \ (1 - L)^{Q - 1} ge 1 - (Q - 1)L \ (1 - (Q - 1)L) (1 - L) ge 1 - QL \ 1 - (Q - 1)L - L(1 - (Q - 1)L) = 1 - QL + (Q - 1)L ge 1 - QL end{array})
证毕。
设有 (c) 个测试点,则失误率 (le c times q times l^h)。
于是让我们来计算一下时间复杂度:
- 质因数分解 (mathcal O(na^{0.5}))
- 预处理前缀和 (mathcal O(h log a))(考虑到一个数的质因数分解最多为 (2 times cdots times 2))
- 询问 (mathcal O(qh))
总时间复杂度 (mathcal O(na^{0.5} + h(log a + q)))。
考虑到时限为 (rm 3s),可以取 (h = 300)。
可以通过。(其实这 (h) 个哈希函数也可以状压,大概会有 (dfrac 1omega) 的常因子优化)