【BZOJ3326】數數(SCOI2013)-數位DP
測試地址:數數 題目大意: 給定兩個位內的進位制數,,對區間內的所有數,累加中所有子串表示的數字的和(如,應該累加到答案中,注意不應該包含前導零),求最終答案(用進製表示)。 做法: 本題需要用到數位DP。 神題。雖然一眼能看出數位DP,但具體的轉移式子還是想錯了好多回,這次終於寫對了。 首先我們來看,對於一個位的數,在它末尾加一位數,會對這個數的所有子串表示的數字和有什麼影響(以下簡寫成)。令表示數所有後綴表示的數字和,那麼有: 根據這個為基礎,我們就能思考數位DP的轉移了。 根據套路,首先把問題轉化為:用小於等於的所有數的貢獻,減去小於等於的所有數的貢獻,於是現在我們考慮求小於等於某個數時的貢獻。 從高位向低位列舉,令表示前位中,不卡/卡上界的所有數的的和,表示前位中,不卡/卡上界的所有數的的和。先分析具體的轉移過程: 前位的數不卡上界時,第位可以填 ~ 內所有的數,並且新的數都不卡上界; 前位的數卡上界時,第位可以填 ~ 。當填 ~ 時,新的數不卡上界,當填時新的數卡上界。 於是我們先考慮的轉移。首先,卡上界的情況應該很好轉移了,實際上就是求上界的值。主要是不卡上界的情況比較複雜。 首先考慮不卡上界轉移到不卡上界的情況。根據上面的轉移式子,我們這樣考慮:首先列舉從到,對於每一個,再列舉可轉移的,把貢獻累加起來。於是一個對整個的貢獻是:,那麼對於所有,對的貢獻就是:。其中就是,而需要斟酌一下。這個和式是在求,對於所有可轉移的(包括),累加它們的位數(把的位數看做)。觀察規律,我們發現:有個,有個,有個,有個…有個,有個,表示的前位組成的字首。那麼前面的有規律的部分可以遞推維護,而顯然也可以遞推維護,所以我們就可以每次地進行這個轉移了。 接下來考慮卡上界轉移到不卡上界的情況。這種情況下,能轉移到不卡上界的情況,必須是 ~ ,而且因為這種情況中可轉移的只有一個,而且就是,因此就比上面的情況簡單很多了,總貢獻應該為。 那麼的轉移討論完了,接下來討論的轉移。就是求上界的,而也利用上面的思考方式,先考慮從不卡上界轉移的情況,因為有種轉移,所以就產生了次的貢獻。再考慮從卡上界轉移的情況,因為有種轉移,所以