【題解】「NOIP2024模擬賽24 T3」鈣綠
https://www.becoder.com.cn/contest/5715/problem/3
\(\mathcal{Description}\)
給定 \(n,p,m\)。對於每個 \(k=0,1,\dots,m\),統計滿足下麵條件的 \(n\) 位 \(10\) 進位制數:(允許前導零
- 各位數之和不超過 \(k\)。
- \(p\) 能整除這個數。
資料範圍:\(1\le n\le 10^9,1\le p\le 50,1\le m\le 1000\)。
\(\mathcal{Solution}\)
看到對 \(p\) 的餘數相關,就應該想到迴圈節一類的。以及鴿巢原理。
\(O(npm)\) 的暴力是 navie 的。發現只有 \(n\) 太大不可接受。
注意到,在某些位置上的相同數字可能對 \(w\) 有著這相同的貢獻。
具體的,一個數字在第 \(x\) 位上的貢獻應該是 \(10^x\bmod p\)。
我們斷言,在 \(x\in[1,n]\) 的範圍內,這個貢獻一定會出現迴圈節不超過 \(p\) 的混合迴圈節(若干個迴圈節和一段長度不超過 \(p\) 的亂序序列組成)。
簡單說明一下:首先只要存在兩個 \(x,x^\prime\) 使得 \(10^{x}\bmod p=10^{x^\prime}\bmod p\),那麼 \(x+1,x^\prime+1\) 也一定滿足上面這個等式。由鴿巢原理,在長度不超過 \(p+1\) 的範圍內必出現兩個\(\bmod p\) 後相等,於是一定存在不超過 \(p\) 的迴圈節。同理,一開始可能存在一段不屬於迴圈節的部分(比如 \(p=5\)),這部分長度也一定不超過 \(p\)(超過 \(p\) 就一定構成迴圈節了。
於是,一個想法是,把這些貢獻相同的位置合併起來處理,這樣就把 \(n\) 降到了 \(p\)。