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,所以在计算匹配长度的时候讨论要细心一点

posted @ 2016-05-10 20:17  _Vertical  阅读(191)  评论(0编辑  收藏  举报