题目:
解题思路:
设
x
>
y
x>y
x>y
∵
g
c
d
(
x
,
y
)
gcd(x, y)
gcd(x,y)
=
=
=
g
c
d
(
x
,
x
−
y
)
gcd(x, x - y)
gcd(x,x−y)
∴
g
c
d
(
x
,
y
)
gcd(x, y)
gcd(x,y)
≤
≤
≤
x
−
y
x - y
x−y
又∵
x
x
x
x
o
r
xor
xor
y
y
y
≥
≥
≥
x
−
y
x - y
x−y
∴当
x
x
x
x
o
r
xor
xor
y
y
y
=
=
=
g
c
d
(
x
,
y
)
gcd(x, y)
gcd(x,y)的时候
x
x
x
x
o
r
xor
xor
y
y
y
=
=
=
g
c
d
(
x
,
y
)
gcd(x, y)
gcd(x,y)
=
=
=
x
−
y
x - y
x−y
因为
g
c
d
gcd
gcd的时间复杂度比
x
o
r
xor
xor高很多,
O
(
l
o
g
2
(
n
)
)
O(log2(n))
O(log2(n)), 所以我们枚举当
x
x
x
x
o
r
xor
xor
y
y
y
=
=
=
x
−
y
x - y
x−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);
}