题目:
解题思路:
设x>yx>yx>y
∵gcd(x,y)gcd(x, y)gcd(x,y) === gcd(x,x−y)gcd(x, x - y)gcd(x,x−y)
∴gcd(x,y)gcd(x, y)gcd(x,y) ≤≤≤ x−yx - yx−y
又∵xxx xorxorxor yyy ≥≥≥ x−yx - yx−y
∴当xxx xorxorxor yyy === gcd(x,y)gcd(x, y)gcd(x,y)的时候
xxx xorxorxor yyy === gcd(x,y)gcd(x, y)gcd(x,y) === x−yx - yx−y
因为gcdgcdgcd的时间复杂度比xorxorxor高很多,O(log2(n))O(log2(n))O(log2(n)), 所以我们枚举当xxx xorxorxor yyy === x−yx - yx−y时ans++
注意一下:在C++里位运算(<<, >>, ^, |, &什么的)运算等级很低,比==, !=什么的还低, 所以要注意利用小括号强行改变运算顺序
Accepted code:
#include<cstdio>
using namespace std;
int n, a, b, ans;
int main() {
scanf("%d", &n);
for(register int c = 1; c <= n/2; c++)
for(register int a = c*2; a <= n; a += c)
if(a-c == (a^c)) ans++;
printf("%d",ans);
}