UVALive 6657
结论:相差大于i的两个数的异或不可能等于i
证明:
假设A>B,A^B=C,将C转化为2进制,则C中1的位置表示A和B该位置不同,即一个为1一个为0,0位表示A和B该位置相同,易知,让不相同的位置A为1,B为0,则此时A-B的差值最大且等于i,因此差值大于i的两个数异或不可能等于i。
#include<cstdio>
using namespace std;
const int N=3e7+10;
int sum[N];
void init(){
for(int i=1; i<N; ++i){
for(int j=i+i; j<N; j+=i){
if((j^(j-i))==i){
sum[j]++;
}
}
}
for(int i=1; i<N; ++i){
sum[i]+=sum[i-1];
}
}
int main(){
init();
int T;
scanf("%d", &T);
int cas=0;
while(T--){
int n;
scanf("%d", &n);
printf("Case %d: %d\n", ++cas, sum[n]);
}
return 0;
}