cojs 简单的数位DP 题解报告
首先这道题真的是个数位DP
我们考虑所有的限制:
首先第六个限制和第二个限制是重复的,保留第二个限制即可
第五个限制在转移中可以判断,不用放在状态里
对于第一个限制,我们可以增加一维表示余数即可
对于第四个限制也是同理
对于第三个限制我们增加一维用0或1表示奇数或是偶数即可
对于第二个限制我们增加一维0/1/2/3表示匹配到第几位即可
这样我们算上位数一共五维做数位DP即可
如何计算平方和?
我们可以很轻松的求出[L,R]中满足条件的个数记为s0
进而我们也可以很轻松的求出[L,R]中满足条件的数的和记为s1
我们发现数位DP每次只转移一位,那么我们只需要考虑这一位的贡献即可
当前可表示为sigma((p*10^k+x)^2)
拆完后可得表示为sigma((p*10^k)^2)+sigma(2*p*10^k*x)+sigma(x^2)
这样我们很容易通过s0’,s1'和s2‘转移出来s0,s1,s2
最后的最后,要注意1314中有两个1,所以在计算匹配长度的时候讨论要细心一点