ARC066B

ARC066B

给定 \(N(1\le N\le 10^{18})\),求 \(u,v\in [0,N]\) 中有多少对 \((u,v)\) 满足存在 \(a,b\) 满足 \(a\oplus b=u,a+b=v\)

\(\rm Sol:\)

观察到 \(v-u=(a\& b)\times 2\),不妨对 \(a\&b(x)\)\(a\oplus b(u)\) 进行计数。

考虑对 \(a,b\) 进行计数,假设当前位 \(a,b\) 均为 \(0\) 或为 \(1\),那么对应的 \(u,x\) 位的数被唯一确定,否则为 \((0,1)\) 则可以交换。

于是假设有 \(m\)01,那么对答案的贡献为 \(\frac{1}{m}\)(于是可以直接数位 dp 统计,复杂度 \(\mathcal O(\log^2 n)\)

观察到一组 \(a,b\) 对答案有贡献当且仅当 \(a+b\le n\),不难注意到交换 \((0,1)\) 对的位置对 "和" 无影响,于是强制让 \(a\) 此位为 \(0\)\(b\)\(1\) 即可。

然后数位 dp 就是 \(\mathcal O(\log n)\)

然而实际上可以直接算,设 \(f_i\) 表示满足 \(a+b\le i\) 且合法的 \((a,b)\) 组数量,然后直接从后往前填数,那么可以得到转移(当前填的数是最后一位)\(f_i=f_{\frac{i}{2}}+f_{\frac{i-1}{2}}+f_{\frac{i-2}{2}}\)

posted @ 2020-09-11 19:26  Soulist  阅读(138)  评论(0编辑  收藏  举报