打表出几个数据后会发现如果 a ^ b == gcd(a, b) == c, 那么 b == a - c。类似筛法选素数, 求出所有符合条件的c即可。
这道题要打表,不然会TLE。
#include <cstdio>
const int maxv = 30000000;
int C[maxv];
void sov() {
for(int c = 1; c <= maxv / 2; c++) {
for(int i = 2; i * c <= maxv; i++) {
int a = i * c;
int b = a - c;
if(c == (a ^ b)) C[a]++;
}
}
for(int i = 1; i <= maxv; i++)
C[i] += C[i - 1];
}
int main() {
int T, Case = 0;
sov();
scanf("%d", &T);
while(T--) {
int N;
scanf("%d", &N);
printf("Case %d: %d\n", ++Case, C[N]);
}
return 0;
}