正睿十连测 第一天 简要题解
\(A.Stone\)
首先有一个结论是 , 任意一个数 \(n\) 都可以拆成 \(3\) 个形如 \({k \choose 2}\) 的数的和。
因为 \(3k^2 - 3k + 1 = 6{k \choose 2} + 1\) , 所以对于任意一个数 \(n\) ,最多需要 \(8\) 个这样的数就能将其组合出。
接着, 我们注意到 \(6{k \choose 2} + 1 \equiv 1 (mod 6)\) ,那么有 \(ans \equiv n(mod 6)\) , 因此只需判断 \(ans\) 是 \(1\) 还是 \(8\) , 是 \(2\) 还是 \(6\)
注意到 \(10^{11}\) 内的形如 \(3k ^ 2 - 3k + 1\) 的数是根号级别的。 于是直接预处理这些数。 对于第一种情况二分求解 , 第二种情况 \(two-pointers\) 扫描, 即可。
时间复杂度 : \(O(\sqrt {limit})\) 取 \(limit = 10 ^ {11}\)。
\(B. Palindrome\)
首先做一遍 \(Manacher\) 算法。
枚举 \(1 \over 3\) 处 , 用扫描线 + \(BIT\) 维护。
时间复杂度 : \(O(NlogN)\)
\(C. Random\)
首先我们知道随机树高是 \(\sqrt n\)级别的。
由期望的线性性质 , 我们不妨对于每个点计算贡献, 那么每个点最多有 \(\sqrt n\) 个祖先。
问题转化为 ,有一个数组 , \(a_{1} , a_{2} , a_{3} , ...... , a_{m}\) , 选择一个排列 ,每次将当前数及后面的数加上其权值, 最后问第 \(m\) 个位置上的数的期望。
我们发现这个贡献等价于以 \(1\) 为开头的上升子序列数量 , 那么直接用组合数的一些技巧就行了。
时间复杂度 : \(O(n \sqrt n)\)