题解 AT4161 【[ARC099B] Snuke Numbers】

皎月半洒花

2020-03-04 22:02:52

Solution

首先这个是可以猜出一部分结论的,大概就是考虑如果数字里面 $9$ 比较多的话肯定会比较符合,因为这样 $\rm S$ 值就会显然更大。其次也是可以打表的。 但是这个题本质上不存在规律。所以以上两种方式可能会挂的很惨。 考虑一种可行的构造方式。首先知道,$1$ 一定是可行的。对于每个当前的 $x$ ,选择那个使得 $y>x$ 且 $\frac{y}{\rm S(y)}$ 最小的 $y$ 来替代当前的 $x$ 。不难理解这样做是可行的。 那大概考虑如何去证明第一个性质,或者稍微形式化一点: > 假设 $y$ 是 $>x$ 且 $\frac{y}{\rm S(y)}$ 最小的那个 $y$,且假设从高位到低位,$x$ 和 $y$ 第一次出现不同的地方是**从低到高的** 第 $p$ 位,那么会有 $y$ 的从低到高 $1\sim p$ 位均为 $9$ 。 证明时考虑如下: 1、对于 $1\sim p-1$ 位的证明是不难的。考虑假设 $y$ 不符合上述规则,那么设出一个 $y'$ ,其中 $1\sim p-1$ 均是 $9$ ,且 $y'$ 的第 $p$ 位是 $y$ 的第 $p$ 位 $-1$ 的数值。那么可以知道 $x\leq y'<y$ 且 $\mathrm{S}(y')\geq \mathrm S(y)$ 。这样的话 $\frac{y}{\mathrm S(y)}>\frac{y'}{\mathrm S(y')}$ 与 $y$ 的定义矛盾。所以 $1\sim p-1$ 均为 $9$。 2、再考虑第 $p$ 位。设 $y$ 的第 $p$ 位值为 $s$,设 $y'=y-10^{p-1}\cdot s$ ,那么有 $$ \frac{y}{\mathrm S(y)}=\frac{y'+10^{p-1}s}{\mathrm S(y')+s} $$ 那么考虑此时 $y'$ 不变,等式右边是一个凹函数(先不考虑怎么凹),在 $s=9$ 或者 $s=0$ 时取得最值。根据定义可知此处应该选择 $s=9$ (因为 $y$ 的第 $p$ 位至少要比 $x$ 的第 $p$ 位大 $1$) _______ 综上,可知后缀必然是某些 $999...999$ 的形式。从个位数向上推就好了。复杂度在 $\Omega(n)\sim O(n\log n)$ 左右。 ```cpp int n ; long long ans ; long long base = 1 ; double s(long long x){ int ret = 0 ; long long y = x ; while (x) ret += (x % 10ll), x /= 10ll ; return (1.0 * y) / (1.0 * ret) ; } int main(){ cin >> n ; while (n --){ while (1){ if (s(ans + base) > s(ans + base * 10ll)) base *= 10ll ; else break ; } ans += base ; printf("%lld\n", ans) ; } } ```