切換
舊版
前往
大廳
主題

ZeroJudge - c543: 四、階梯數字(ladder) (APCS 加強題) 解題心得

Not In My Back Yard | 2019-03-02 19:46:26 | 巴幣 0 | 人氣 2532

題目連結:


題目大意:
階梯數字指的是一個數字從最高的位數(最左)到最低的位數(最右),當中的經過的數字不會遞減(遞增或相等)。例如: 11228 是一個階梯數字,但是 121 不是。

而在此 0 不算作階梯數字,且階梯數字不會以 0 作為開頭。

現給定一正整數 N (N ≦ 10 ^ 100, 000),求小於或等於N的階梯數字有多少個。將答案取 10 ^ 9 + 7 的餘數之後再輸出。



範例輸入:
25
23456
54321
88888888


範例輸出:
22
1365
1875
24301


解題思維:
想法上來說,跟 b593: Coded209: 古代神祕文字 這兩題相當類似。

例如 N = 2232 ,我們需要先求長度為 1 、 2 、 3 的階梯數字。而下列圖表
顯示了以 9 作為開頭(最高位)且長度為 1 、以 8 作為開頭且長度為 1 ……的階梯數字之數量。不難看出是一個經典的巴斯卡三角形。

因此,長度為 L 的階梯數字之數量只要把 9 開頭、8 開頭等等長度皆為 L 的加總即可。

因為我們舉例的 N 為 ,所以現在累積的數量為:
長度 1 + 長度 2 + 長度 3 = 219 個數字
而開頭為 ,所以開頭為 1 的已經算完了,將其加上:
219 + 開頭為 1 且長度為 4 = 384
接著的數字為 ,沒有遞增所以沒有其他新的階梯數字。
再來是 ,因為遞增了,所以要把以 222 作為開頭的階梯數字加上去,而其等價於:
384 + 以 2 開頭且長度為 2 的階梯數字 = 392
最後是 ,但是因為數字變小了,所以接下來再遞增也不會有新的階梯數字,因此可以跳開了。

因此, ≦ 2232 的階梯數字有 392 個。而其他的 N 值也與上同理可得。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作