(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))