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}}\)