ARC066B

ARC066B

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

( m Sol:)

观察到 (v-u=(a& b) imes 2),不妨对 (a&b(x))(aoplus 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+ble n),不难注意到交换 ((0,1)) 对的位置对 "和" 无影响,于是强制让 (a) 此位为 (0)(b)(1) 即可。

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

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

原文地址:https://www.cnblogs.com/Soulist/p/13653603.html