【PR #4】到底有没有九

给定整数 \(n\)\(k\)。定义整数 \(x\) 是好的,当且仅当 \(x\) 满足下列条件:

  • \(x \times (10^k - 1)\) 的十进制表示中不包含 \(9\)

求第 \(n\) 个好的整数 \(x\),其中 \(1 \leq k \leq 18\)\(1 \leq n \leq 10^{18}\)


考虑刻画 \(x \times (10^k - 1)\) 的值,令 \(y = x \times (10^k - 1)\)

则此时需要让 \(y\) 的十进制表示中不包含 \(9\),且 \(y\)\(10^k - 1\) 的倍数。

记第 \(n\)\(x\)\(x_0\),第 \(n\)\(y\)\(y_0\),则 \(y_0 = x_0 \times (10^k - 1)\)

也就是说,我们只需要算出 \(y_0\) 即可。


  • 结论 \(1\)\(y_0\) 的位数是 \(O(k + \log n)\) 的。

不包含 \(9\)\(t\) 位数约有 \(9^t\) 个,其不是 \(10^k - 1\) 的倍数的概率约为 \(10^{-k}\)

也就是说,\(t\) 位数中满足条件的 \(y\) 约有 \(\dfrac{9^t}{10^k}\) 个。

考虑 \(\dfrac{9^t}{10^k}\) 约为 \(n\),即 \(9^t\) 约为 \(10^k \times n\)

也就是说,\(t\) 约为 \(\log_9(10^k \times n)\),即 \(t\)\(O(k + \log n)\) 的。


不妨钦定 \(y\) 的位数为 \(t\),不足时在高位补 \(0\)

考虑常见的套路,我们逐位确定答案。

\(y = \overline{y_1 y_2 \dots y_t}\),我们要回答 \(O(k + \log n)\) 次下面的询问:

  • 给定 \(y_1,y_2,\dots,y_p\),求此时合法的 \(y\) 个数。

考虑小学奥数经典结论:

  • \(y\) 从最低位开始 \(k\) 位一断,所有段的和 \(s\)\(y\) 在模 \(10^k - 1\) 意义下同余。

由于 \(k\)\(t\) 很小,分成的段数不会很多。

从低往高填数即可,进行 dp,复杂度不知道,反正能过。

posted @ 2026-01-11 16:41  Oken喵~  阅读(7)  评论(0)    收藏  举报