题目:http://community.topcoder.com/stat?c=problem_statement&pm=12623&rd=15707
参考:http://apps.topcoder.com/wiki/display/tc/SRM+595
关于位运算的题目应当考虑 逐位 进行dp.
代码:
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <cstring>
#include <ctime>
using namespace std;
#define CHECKTIME() printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC)
/*************** Program Begin **********************/
long long dp[31][2][2][2];
vector <int> dA, dB, dC;
class LittleElephantAndXor {
public:
long long rec(int t, int eqA, int eqB, int eqC)
{
if (t == -1) {
return 1;
}
long long & res = dp[t][eqA][eqB][eqC];
if (res != -1) {
return res;
}
res = 0;
for (int a = 0; a <= 1; a++) {
for (int b = 0; b <= 1; b++) {
int eqA2, eqB2, eqC2;
if (eqA == 1) {
if (a > dA[t]) {
continue;
} else if (a == dA[t]) {
eqA2 = 1;
} else {
eqA2 = 0;
}
} else {
eqA2 = 0;
}
if (eqB == 1) {
if (b > dB[t]) {
continue;
} else if (b == dB[t]) {
eqB2 = 1;
} else {
eqB2 = 0;
}
} else {
eqB2 = 0;
}
int c = a ^ b;
if (eqC == 1) {
if (c > dC[t]) {
continue;
} else if (c == dC[t]) {
eqC2 = 1;
} else {
eqC2 = 0;
}
} else {
eqC2 = 0;
}
res += rec(t - 1, eqA2, eqB2, eqC2);
}
}
return res;
}
long long getNumber(int A, int B, int C) {
long long res = 0;
memset(dp, -1, sizeof(dp));
dA.clear(); dB.clear(); dC.clear();
for (int i = 0; i < 31; i++) {
dA.push_back(A & 1);
dB.push_back(B & 1);
dC.push_back(C & 1);
A >>= 1; B >>= 1; C >>= 1;
}
res = rec(30, 1, 1, 1);
return res;
}
};
/************** Program End ************************/