题意翻译
输入数据组数t,接下来t行每行给定一个数字n,如样例所示格式输出满足1<=b<=a<=n且gcd(a,b)==a xor b的(a,b)二元组个数。
translated by @AdzearDisjudge
输入输出样例
输入 #1复制
2
7
20000000
输出 #1复制
Case 1: 4
Case 2: 34866117
解析啥的去看紫书吧 预处理+O(1)查询
#include<cstring>
#include<cstdio>
using namespace std;
const int Maxn = 30000000;
int cnt[Maxn + 1],sum[Maxn + 1];
void Pre() {
memset(cnt,0,sizeof(cnt));
int b;
for(int c=1; c<=Maxn; c++) {
for(int a=c*2; a<=Maxn; a+=c) {//这样保证gcd(a,c) == c
b = a - c;
if(c == (a ^ b)) cnt[a] ++;
}
//printf("---\n");
}
sum[0] = 0;
for(int i=1; i<=Maxn; i++) sum[i] = sum[i-1] + cnt[i];
}
int main(int argc,char* argv[]) {
int T,kase = 0,n; scanf("%d",&T);
Pre();
while(T--) {
scanf("%d",&n);
printf("Case %d: %d\n",++kase,sum[n]);
}
return 0;
}