Loading

AT problems

...

ARC066B

首先有个显然的结论 \(a+b=(a \land b)\times 2+(a \oplus b )\) 。证明的话可以考虑每一位上 \((0,1),(1,0),(1,1)\) 分别在两边被统计的次数。

设符合条件的一组解为 \((u,v)\),且 \(u\ge v\),此时必须要满足的条件就是:设 \(k=(u-v)\),那么 \(k \mod 2=0\)
此时你发现 \(a\land b=k/2\),那么 \((a,b)\) 就分别为 \((k/2+p,k/2+q),p+q=v\)
于是 v 的每一个 \(1\) 的位置必须分配在 \(a,b\) 中的一个,且每个 \(0\) 的位置 \(a,b\) 在那一位也必须为 \(0\)
分析了一下就把条件简化成了 \(t\land v=0\)。(\(t=k/2\)
然后我们就会了 \(n^2\) 的做法,去考虑用 dp 优化这个过程,但我们又不能把 \(k,u,v\) 这种很大的变量设计进状态,根据套路很容易想到用 数位 dp 来减少记录无用的状态。具体的,设 \(dp_{i,j,op}\) 表示考虑到前 \(i\) 位,当前需要的进位\(j\)\(2\times t+v\) 的前 \(i\) 位与 \(n\) 的前 \(i\) 位哪个更大(因为 \(u\)\(v\) 要求 \(\le n\),而 \(u=2\times t+v\ge v\) 所以要记录这么一维状态,表示当前 \(u\) 的大小和 \(n\) 的大小比较)
这里顺推比较容易实现,于是我们就直接顺推,转移的时候枚举当前位的 \((t,v)\) 分别是 \((0,0),(1,0),(0,1)\) 的情况分别转移,注意进位和大小要根据之前位和当前位而做改变。
发现和 这个题 的套路简直是一模一样...

复杂度是 \(10\log n\),随便跑跑都能过 ...

代码

posted @ 2022-03-31 14:05  MatrixCascade  阅读(55)  评论(0)    收藏  举报