題目連結:
題目大意:
階梯數字指的是一個數字從最高的位數(最左)到最低的位數(最右),當中的經過的數字不會遞減(遞增或相等)。例如: 11228 是一個階梯數字,但是 121 不是。
而在此 0 不算作階梯數字,且階梯數字不會以 0 作為開頭。
現給定一正整數 N (N ≦ 10 ^ 100, 000),求小於或等於N的階梯數字有多少個。將答案取 10 ^ 9 + 7 的餘數之後再輸出。
例如 N = 2232 ,我們需要先求長度為 1 、 2 、 3 的階梯數字。而下列圖表
顯示了以 9 作為開頭(最高位)且長度為 1 、以 8 作為開頭且長度為 1 ……的階梯數字之數量。不難看出是一個經典的巴斯卡三角形。
因此,長度為 L 的階梯數字之數量只要把 9 開頭、8 開頭等等長度皆為 L 的加總即可。
因為我們舉例的 N 為 2232 ,所以現在累積的數量為:
長度 1 + 長度 2 + 長度 3 = 219 個數字
而開頭為 2 ,所以開頭為 1 的已經算完了,將其加上:
219 + 開頭為 1 且長度為 4 = 384
接著的數字為 2 ,沒有遞增所以沒有其他新的階梯數字。
再來是 3 ,因為遞增了,所以要把以 222 作為開頭的階梯數字加上去,而其等價於:
384 + 以 2 開頭且長度為 2 的階梯數字 = 392
最後是 2 ,但是因為數字變小了,所以接下來再遞增也不會有新的階梯數字,因此可以跳開了。
因此, ≦ 2232 的階梯數字有 392 個。而其他的 N 值也與上同理可得。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。