QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: ZnPdCo

Posted at: 2026-03-30 20:46:52

Last updated: 2026-03-30 20:47:11

Back to Problem

New Editorial for Problem #2835

题目大意:

记 $o_i = \underbrace{111\cdots1}_{i\text{个}1}$,即十进制下 $i$ 个连续的 $1$。

现在给定一个正整数 $n$,找到一个无限长的整数序列 $(x_1, x_2, \dots)$,满足:

  1. $\sum_{i=1}^{\infty} o_i x_i = n$。
  2. 最小化 $\sum_{i=1}^{\infty} i|x_i|$。

令 $|n|$ 表示 $n$ 十进制下的位数。

观察容易得到 $|x_i|<10$,这是因为当 $x_i=10$ 时,可以将其转换为 $x_{i+1}$ 加上 $1$,$x_1$ 减去 $1$,此时代价最多是 $2$,优于原本的 $10$。$x_i=-10$ 同理。

但是 $2$ 实际上比 $10$ 要小很多,所以我们发现这个限制还可以更紧!容易有一个等式: $$ 10o_i=o_{i+1}-o_1 $$ 则: $$ x\cdot o_i=o_{i+1}-o_1-(10-x)o_i $$ 那么左边的代价是 $x\cdot i$,右边的代价最多是 $i+1+1+(10-x)\cdot i$。我们如果要使得左边不劣于右边,则是: $$ x\cdot i< i+1+1+(10-x)\cdot i $$ 解得: $$ 2x<11+\frac{2}{i} $$ 当 $i=1$ 时式子最严格,可以得到 $x\le 6$。负数同理。

所以我们得到了 $|x_i|\le 6$。

另外一个发现是非零 $x_i$ 的 $i$ 最大不会太大,最高位不会超过 $|n|+1$(如果认为最低位是第 $1$ 位的话),否则当一个比 $n$ 的位数还要高得多的位不为 $0$ 的话,我们可能会需要在低位把它剪掉,而此时肯定会使得 $|x_i|>6$。

尝试刻画 $o_i$,实际上我们发现: $$ o_i=(10^i-1)/9 $$ 那么我们的等式 $\sum_{i=1}^{\infty} o_i x_i = n$ 变成了: $$ \sum_{i=1}^{\infty} (10^i-1)/9 \cdot x_i = n $$ 稍作转换: $$ \sum 10^i\cdot x_i = 9n + \sum x_i $$ 尝试去枚举 $\sum x_i$,看看我们能不能构造出一组合法的 $x_i$ 使得上面的等式成立。

而因为 $|x_i|\le 6$,所以枚举 $\sum x_i$ 为 $-|n|\cdot 6\sim|n|\cdot 6$。这一部分是 $O(|n|)$ 的。

此时我们发现等式左边的结果一定是 $10$ 的倍数,所以在枚举 $\sum x_i$ 时,我们需要使得等式右边的结果也是 $10$ 的倍数。

然后此时不难构造出一组能使得等式成立的 $x_i$,就是将 $9n + \sum x_i$ 第 $i+1$ 位的数字赋给 $x_i$,因为 $9n + \sum x_i$ 最低位是 $0$,所以这么做之后等式就成立了。我们称这里构造出来的 $x$ 的值为 $x'_i$。

我们发现虽然 $x'_i$ 的构造满足了上面的式子,但是它不一定满足 $\sum x'_i=\sum x_i$。所以我们需要进行一些调整。

一个观察是: $$ \sum x'_i\equiv \sum x_i \pmod 9 $$ 这是因为有一个结论:一个整数的每一位之和和这个整数本身模 $9$ 同余,这个结论小学数学书上有。

而我们可以看作这里 $\sum x'_i$ 就是 $9n + \sum x_i$ 的每一位之和,所以他们两个同余,而 $9n$ 一定是 $9$ 的倍数,可以删去。

那么它们两个只相差若干倍 $9$,考虑通过调整 $x'_i$ 使得两边相等。一个调整是利用 $x'_{i+1}$ 加 $1$,$x'_{i}$ 减 $10$,等式不被破坏的性质去调整,此时我们发现 $\sum x'_i$ 刚好减去了 $9$。同理 $x'_{i+1}$ 减 $1$,$x'_i$ 加 $10$ 可以使得 $\sum x'_i$ 加上 $9$。

但是实际上我们发现我们是不会利用「$x'_{i+1}$ 减 $1$,$x'_i$ 加 $10$」这个操作的,因为最开始我们得到的 $x'_i$ 是 $[0,9]$ 的,而如果把它加上 $10$ 之后一定不会满足 $|x'_i|\le 6$,一定不优。

同理,我们发现「$x'_{i+1}$ 加 $1$,$x'_i$ 减 $10$」这个操作对同一个 $i$ 只会操作一次,否则操作两次的话也会使得 $x'_i$ 变得很小,不满足 $|x'_i|\le 6$。

此时利用这一点,我们可以设计一个 dp: $$ f_{i,j,0/1} $$ 这里表示目前我们处理完了 $x'_i$,前面减去了 $j$ 个 $9$,第 $i$ 位有没有应用 $+1$ 操作(如果是的话,我们要在下一位 $-10$)的最小的 $\sum_{l=i}^{\infty} l|x_l|$。

最后我们直接取出 $f_{1,j,0}$ 即可。这里的 $j=(\sum x'_i-\sum x_i)/9$。

算算复杂度,枚举 $\sum x_i$ 是 $O(|n|)$ 的,而 dp 则是 $O(|n|^2)$ 的,所以复杂度是 $O(|n|^3)$,难以通过。

但是我们发现每次我们 $\sum x_i$ 增加,对 $9n+\sum x_i$ 也只是更改一段而已。而 dp 可以不用重复算前面相同的部分,直接从发生更改的位置重算,然后这个更改位置的长度和均摊是 $O(|n|\log |n|)$ 的,所以复杂度变成了 $O(|n|^2\log |n|)$,可以通过。

可能需要写高精度,但实际上用到的只是高精度里非常非常小的一个子集,很好写。

Submission

Comments

No comments yet.