题解
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的个数、合法方案的长度之间的关系。
所以我得好好补习数论否则就透心凉心飞扬了