当前位置: 代码迷 >> 综合 >> 数位dp hdu5598 GTW likes czf
  详细解决方案

数位dp hdu5598 GTW likes czf

热度:5   发布时间:2023-12-14 03:33:37.0

传送门:点击打开链接

题意:告诉l,r,g,t,每次在[l,r]区间内选一个数字,再从g,t这两个数字里面选一个数字,求这两个数字的@值。定义x@y=((x&y)|y)^x

思路:首先,我们能够证明,x@y=((x&y)|y)^x其实就等于x^y,这算是第一个绕圈把

然后呢,我们再考虑到,一个数x对n个不同的数字求位异或,那么位异或的结果一定都不同。

所以,题目可以转换成(r-l+1)*2-num,num是满足如下条件的a和b的对数

a,b属于[l,r], 且 a^g=b^t,我们稍微变形一下,就得到a^b=g^t

所以最后题目转换成了求[l,r]中有多少对(a,b),使得a^b=g^t


因为区间有左端,我们可以通过容斥进一步的简化题目。

设S(m,n)函数能求出a在区间[1,m],b在区间[1,n],然后a^b=g^t的对数

那么要求a在区间[l,r],b在区间[l,r],然后求a^b=g^t的个数就可以转换成S(r,r)-S(l-1,r)*2+S(l-1,l-1),原理是容斥定理,可以仔细去想想

到上面的步数,应该都是很容易就能看懂的,问题是S(m,n)函数要如何来实现

这里我们用数位dp来实现


那么对于S(a,b)

设dp[n][i][j]表示正在考虑