1. 程式人生 > >【BZOJ3326】數數(SCOI2013)-數位DP

【BZOJ3326】數數(SCOI2013)-數位DP

測試地址:數數 題目大意: 給定L,RL,R兩個10510^5位內的B(105)B(\le 10^5)進位制數,LRL\le R,對區間[L,R][L,R]內的所有數xx,累加xx中所有子串表示的數字的和(如123123,應該累加123+12+23+1+2+3123+12+23+1+2+3到答案中,注意不應該包含前導零),求最終答案(用1010進製表示)。 做法: 本題需要用到數位DP。 神題。雖然一眼能看出數位DP,但具體的轉移式子還是想錯了好多回,這次終於寫對了。 首先我們來看,對於一個lenlen位的數xx,在它末尾加一位數s

s,會對這個數的所有子串表示的數字和有什麼影響(以下簡寫成sum(x)sum(x))。令suf(x)suf(x)表示數xx所有後綴表示的數字和,那麼有: suf(xnew)=suf(xlast)B+s(len+1)suf(x_{new})=suf(x_{last})\cdot B+s\cdot (len+1) sum(xnew)=sum(xlast)+suf(xnew)sum(x_{new})=sum(x_{last})+suf(x_{new}) 根據這個為基礎,我們就能思考數位DP的轉移了。 根據套路,首先把問題轉化為:用小於等於RR的所有數的貢獻,減去小於等於L1L-1的所有數的貢獻,於是現在我們考慮求小於等於某個數TT時的貢獻。 從高位向低位列舉,令Sum(i,0/1)Sum(i,0/1)表示前ii位中,不卡/卡上界的所有數的sum(x)sum(x)的和,Suf(i,0/1)Suf(i,0/1)表示前ii位中,不卡/卡上界的所有數的suf(x)suf(x)的和。先分析具體的轉移過程: 前i1i-1位的數不卡上界時,第ii位可以填00 ~ B1B-1內所有的數,並且新的數都不卡上界; 前i1i-1位的數卡上界時,第ii位可以填00 ~ T[i]T[i]。當填00 ~ T[i]1T[i]-1時,新的數不卡上界,當填T[i]T[i]時新的數卡上界。 於是我們先考慮SufSuf的轉移。首先,卡上界的情況應該很好轉移了,實際上就是求上界的sufsuf值。主要是不卡上界的情況比較複雜。 首先考慮不卡上界轉移到不卡上界的情況。根據上面的轉移式子suf(xnew)=suf(xlast)B+s(len+1)suf(x_{new})=suf(x_{last})\cdot B+s\cdot (len+1),我們這樣考慮:首先列舉ss00B1B-1,對於每一個ss,再列舉可轉移的xlastx_last,把貢獻累加起來。於是一個ss對整個SufSuf的貢獻是:Bsuf(xlast)+s(len(xlast)+1)B\cdot \sum suf(x_{last})+s\cdot \sum (len(x_{last})+1),那麼對於所有ss,對SufSuf的貢獻就是:BBsuf(xlast)+B(B1)2(len(xlast)+1)B\cdot B\cdot \sum suf(x_{last})+\frac{B(B-1)}{2}\cdot \sum (len(x_{last})+1)。其中suf(xlast)\sum suf(x_{last})就是Suf(i1,0)Suf(i-1,0),而(len(xlast)+1)\sum (len(x_{last})+1)需要斟酌一下。這個和式是在求,對於所有可轉移的xlastx_last(包括00),累加它們的位數+1+1(把00的位數看做00)。觀察規律,我們發現:1111個,22B1B-1個,33(B1)B(B-1)\cdot B個,44(B1)B2(B-1)\cdot B^2個…i1i-1(B1)Bi3(B-1)\cdot B^{i-3}個,iinumBi2num-B^{i-2}個,numnum表示TT的前ii位組成的字首。那麼前面的有規律的部分可以遞推維護,而numnum顯然也可以遞推維護,所以我們就可以每次O(1)O(1)地進行這個轉移了。 接下來考慮卡上界轉移到不卡上界的情況。這種情況下,能轉移到不卡上界的情況,ss必須是00 ~ T[i]1T[i]-1,而且因為這種情況中可轉移的xlastx_{last}只有一個,而且len(xlast)len(x_{last})就是i1i-1,因此就比上面的情況簡單很多了,總貢獻應該為Suf(i1,1)B+T[i](T[i]1)2iSuf(i-1,1)\cdot B+\frac{T[i](T[i]-1)}{2}\cdot i。 那麼SufSuf的轉移討論完了,接下來討論SumSum的轉移。Sum(i,1)Sum(i,1)就是求上界的sumsum,而Sum(i,0)Sum(i,0)也利用上面的思考方式,先考慮從不卡上界轉移的情況,因為有BB種轉移,所以Sum(i1,0)Sum(i-1,0)就產生了BB次的貢獻。再考慮從卡上界轉移的情況,因為有T[i]T[i]種轉移,所以Sum(i1,