1. 程式人生 > >[AGC 011 E]Increasing Numbers

[AGC 011 E]Increasing Numbers

對稱 dot 就是 spa 一個數 滿足 limit clas 數量

題意

給出一個數N,要求分成最少數量的“上升數”,就是各個數位從高位到低位單調不降的數的和,求最少能分成多少數。
\(1\leq N\leq10^{500000}\)

分析

考慮一個所謂的“上升數”,一定可以表示為不超過9個形如\(1,11,111,\cdots\)的數之和(數位最多上升9次),那麽假設這個\(N\)可以分成不超過\(k\)個“上升數”之和,那麽這其實也相當於分成不超過\(9k\)個這樣由1組成的數之和。也就是\(N=\sum\limits_{i=1}^{9k}(10^{r_i}-1)/9\)的形式。

簡單化一下式子就可以得到這個式子等價於\(9N+9k=\sum\limits_{i=1}^{9k}10^{r_i}\)

,我們發現\(k\)的範圍只能是\(1\cdots L\)\(L\)表示\(N\)的長度,那麽直接枚舉\(k\),每次往左邊的數(\(9N+9k\),每次\(k\)增加1)裏面加9,判定一下右邊是否能滿足就可以得到最小的\(k\)了。

這個題目算是一個挺腦洞的題目,最主要是需要註意到“上升數”能夠拆成這樣一個非常對稱的優美形式。

[AGC 011 E]Increasing Numbers