题意:求有多少个数字对 <u,v> <script type="math/tex" id="MathJax-Element-13"> </script>满足 0≤u,v≤N 并且存在两个整数 a,b 使得 a+b=u,a xor b=v
分析:我们发现只要 a,b 不超过 N ,那么
a xor b 也不会超过 N ,所以关键就是要保证a+b 不超过 N ,那么问题就转换成找到有多少组a,b 使得 a+b≤N图解:
AC代码:
/*************************************************************************
> File Name: test.cpp
> Author: Akira
> Mail: qaq.febr2.qaq@gmail.com
************************************************************************/
#include<bits/stdc++.h>
typedef long long LL;
typedef unsigned long long ULL;
typedef long double LD;
#define MST(a,b) memset(a,b,sizeof(a))
#define CLR(a) MST(a,0)
#define Sqr(a) ((a)*(a))
using namespace std;
#define MaxN 100001
#define MaxM MaxN*10
#define INF 0x3f3f3f3f
#define PI 3.1415926535897932384626
const int mod = 1E9+7;
const double eps = 1e-6;
#define bug cout<<88888888<<endl;
#define debug(x) cout << #x" = " << x << endl;
LL N;
map<LL,LL> DP;
LL dp(LL x)
{
if(DP[x]) return DP[x];
else
{
return DP[x] = ( dp(x/2) + dp((x-1)/2) + dp((x-2)/2) )%mod;
}
}
int main()
{
//std::ios::sync_with_stdio(false);
DP[0] = 1;
DP[1] = 2;
cin >> N;
cout << dp(N) << endl;
system("pause");
}