Description
求点对 (u,v) 的数目,满足
∃a,b,a xor b=u,a+b=v,u≤N,v≤N
Solution
在知乎上看到一个小 trick 。
a xor b=a+b−2(a and b)
然后就可以数位DP了。
官方题解给出的状态好像挺妙的。
#include<bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
typedef pair<long long, long long> Pairs;
long long n;
map<Pairs, int> dp;
inline void Add(int &x, int a) {
x += a; while (x >= MOD) x -= MOD;
}
inline int Calc(long long u, long long v) {
if (v < 0) return 0;
if (!v) return 1;
if (dp.count(Pairs(u, v))) return dp[Pairs(u, v)];
int res = 0;
Add(res, Calc(u >> 1, v >> 1));
Add(res, Calc((u - 1) >> 1, (v - 1) >> 1));
if (v >= 2) Add(res, Calc(u >> 1, (v - 2) >> 1));
return dp[Pairs(u, v)] = res;
}
int main(void) {
freopen("1.in", "r", stdin);
cin >> n;
cout << Calc(n, n) << endl;
return 0;
}