題解
30pts
考慮到L和R的範圍都很小,直接暴力枚舉L~R然後統計答案即可。
70pts
如果觀察一下,你會發現以下幾個性質:
1.num01+num10+num11+num00= len-1。
2. num01+1≥num10≥num01,因爲10,01是交替出現的。
3. num10+num00 是0出現的次數。
4. num01+num11+1 是1出現的次數。
這個可以自己手推一下,很容易證明。
那麼這個字符串長什麼樣,其實已經大體確定了,舉例說明:
10001010110111111010
由於所有的01和10之間全是1,所有的10和01之間全是0,因此我們可以把字符串看成幾段:
1 000 1 0 1 0 11 0 111111 0 1 0
考慮數位DP,記錄當前是第 i 位,前面出現了 j段,1 (或0) 出現了 k 次的方案數,再多記一個是否超過上界,枚舉下一位轉移即可。
100pts
如果我們已知上界R是 1011100010
那麼對於前五位是 10110 的數來說,後面的位置無論怎麼選都不會超過R。
我們就考慮啊,能不能快速算出這時候符合條件的方案數呢?
還真可以!
我們從第一位往最後一位掃一遍,過程中記錄後面還能出現多少個0和1(具體實現是記錄10,00,01,11的個數)。每掃到一個爲1的位置,考慮如果我們在這一位放0的話後面就可以亂選了,因此我們就給ans加上當前位及之前已經確定,後面隨便選,且符合條件的方案數。這個方案數可以這麼表示:
+
如果不能一下子理解,可以回到上面去看下那幾個式子,帶進來理解一下。
其實這就是個球盒問題,是
球相同(每一段1內部的1的順序不重要)
盒子不同(每一段的前後位置不同)
且不能空盒(每一段都不爲空)
的那一種。
所以就這樣 logR 的掃一遍,再 logL 的掃一遍,把兩個答案減一下,就做完啦~
最後,因爲你計算的是<R和<L的方案數,相減得到的ans是在[L,R)的區間,所以還需要特判R本身能否滿足條件。
至此,我們就開心的做完啦~
當然具體的實現還需要判斷一些特殊的情況,比如當lenL或lenR小於合法長度的時候直接返回方案數爲0,lenL或lenR大於合法長度時直接返回所有滿足條件的方案數,這些就是細節問題啦。
總結
看到的第一眼就想到了數位DP,礙於自己連數位DP的模板題都沒練過只好打了30pts的暴力……
其實這道題還是在尋找規律,尋找的是給定的01,00,10,11的個數與1的個數、0的個數、合法方案的長度之間的關係。
所以我得好好補習數論否則就透心涼心飛揚了