CF1846E2 Rudolf and Snowflakes (hard version) 题解

发布时间 2023-11-29 23:08:29作者: ShawyYum

题意:

\(T\) \((\)\(1\) \(\le\) \(T\) \(\le\) \(10^4\)\()\) 组询问:是否存在一个满 \(k\) (\(k\) \(\ge\) \(2\)\()\) 叉树节点数恰好为 \(n\) \((\)\(1\) \(\le\) \(n\) \(\le\) \(10^{18}\)\()\),且深度 \(depth\) 至少为 \(2\)

思路:

满 $ k $ 叉树的节点数 $ n = k^0 + k^1 + k^2 + ... + k^{depth} = \frac {k^{depth + 1} - 1} {k - 1} $ 。

观察,当 $ k > 10^6,depth > 2 $ 时, $ n = \frac {k^{depth + 1} - 1} {k - 1} > 10^{18} $ ,因此当 $ k > 10^6 $ 时,其可行的 $ depth $ 一定为 $ 2 $ 。因此考虑数据分治

对于$ k \in [2,10^6] $ ,枚举 $ k $ 和 $ depth $ ,在 $ \frac {k^{depth + 1} - 1} {k - 1} $ 不超过 $ 10^{18} $ 的情况下,将可行结果 $ n $ 记录在 $ set $ 里面。

由于 $ (k - 1) / (k - 1) = 1 $ , $ (k^2 - 1) / (k - 1) = k + 1,(k^3 - 1) / (k - 1) = k^2 + k + 1 $ ,可以证明对于任意 $ k^x(x \ge 4) $ ,均有:

$ \frac {k^x - 1} {k - 1} = \frac {(k^3 - 1) * k^{x - 3} + (k^{x - 3} - 1)} {k - 1} = \frac {(k^3 - 1) * k^{x - 3}} {k - 1} + \frac {k^{x - 3} - 1} {k - 1} = (k^2 + k + 1) + \frac {k^{x - 3} - 1} {k - 1} $

对于 $ k^{x - 3} $ ,当 $ x - 3 \ge 4 $ 时,重复以上过程;当 $ 1 \le x - 3 \le 3 $ 时, $ k^{x - 3} - 1 $ 一定为整数。因此,对于任意 $ k^x(x \ge 1) $ ,均有 $ (k^x - 1) $ $ \bmod $ $ (k - 1) = 0 $ 。

由于 $ 2^{60} > 10^{18} $ ,那么对于枚举 $ k $ 和 $ depth $ ,求解 $ \frac {k^{depth + 1} - 1} {k - 1} $ 时,最多产生不超过 $ 10^6 * 70 $ 个结果,因此对 $ set $ 查询可行结果 $ n $ 时,不会超时。

对于 $ k \in [10^6 + 1,10^9 + 10] $ ,由于 $ depth = 2 $ ,则可行结果 $ n = k^2 + k + 1 $ 在 $ k \in [10^6 + 1,10^9 + 10] $ 上单调递增,因此可以二分查找可行结果 $ n $ 。