Hash 题解
题意:
- 令 \(P=998244353\),给出四个整数 \(F(T),X,Y,Z\),其中 \(X,Y,Z\) 在 \([2,P-2]\) 中随机生成。
- 定义一棵树的哈希值为 \(\sum_{i<j}X^iY^jZ^{\text{lca}(i,j)}\bmod P\)。
- 需要构造出点数 \(\le 50\) 的树满足哈希值等于 \(F(T)\)。多测。\(20\) 组数据。
考虑令初态为每个节点的父亲都是 \(1\),设初始哈希值为 \(H_0\),考虑在此基础上进行调整。我们考虑构造一棵 \(n=37\) 的树。具体调整方法是,我们将 \(2\sim 37\) 分成 \(6\) 组,每组 \(6\) 个节点,并从每组中选出三个节点 \(x,y,z\),将 \(x,y\) 的父亲均改为 \(z\)。这样总共会有恰好 \(12\) 个节点的父亲不是 \(1\)。
每组的调整方法有 \(\dbinom{5}{2}·6=90\) 种,对于每种调整方法我们计算出其对哈希值产生的增量 \(\Delta H\)。由于 \(X,Y,Z\) 是从 \([2,998244351]\) 中随机生成的,所以 \(\Delta H\) 也可视作 \([0,998244352]\) 中的随机数。
于是现在任务转化为,现在有 \(6\) 组数,每组中有 \(90\) 个数,现在要从每组中选一个数使它们的和 \(\equiv f(T)-H_0\pmod{998244353}\)。这是经典问题,折半搜索即可,时间复杂度 \(90^3·\log V\),其中 \(\log\) 来源于 std::map。由于所有数都可视作随机生成,因此存在解的概率可以视作 \(90^6\) 个数中存在一个数与给定数 \(\bmod 998244353\) 同余的概率,其值等于 \(1-(\dfrac{998244352}{998244353})^{5.31441\times 10^{11}}\),使用计算器可算出 \((\dfrac{998244352}{998244353})^{5.31441\times 10^{10}}\) 已经达到了 \(10^{-24}\) 级别,因此 \(1-(\dfrac{998244352}{998244353})^{5.31441\times 10^{11}}\) 大约是 \(1-10^{-240}\) 级别的,如果实在不放心多随几次必然可以随出正确答案。
关于此题的 idea:出题人大概是今年三月份无意中想到了这个 idea,刚一想到这道题的 idea 时,出题人觉得这题将一个看似不可做的问题转化为 meet-in-the-middle 的思想很妙,但很可惜这类题目由于不好设计部分分,因此无法将其放到 OI 赛制的比赛中,于是就把它投到这里来了。
关于此题的考点:此题考察了选手的构造、随机化、meet-in-the-middle 等的能力,但出题人认为此题最大的难点在于发现此题的思路是通过随机化保证随机到正确答案的概率相对来说较大,而不是像一般的策略构造题那样给出一个普遍性的构造策略。

浙公网安备 33010602011771号