题目大意:
题目链接:https://jzoj.net/senior/#main/show/4714
题目图片:
http://wx4.sinaimg.cn/mw690/0060lm7Tly1fwp1egqfr7j30j70gkglv.jpg
给定一个正整数
n
n
n,求在
[
1
,
n
]
[1,n]
[1,n]的范围内,有多少个无序数对
(
a
,
b
)
(a,b)
(a,b)满足
g
c
d
(
a
,
b
)
=
a
x
o
r
b
gcd(a,b)=a\ xor\ b
gcd(a,b)=a xor b。
思路:
令
c
=
g
c
d
(
a
,
b
)
=
a
x
o
r
b
c=gcd(a,b)=a\ xor\ b
c=gcd(a,b)=a xor b,证明满足
g
c
d
(
a
,
b
)
=
a
x
o
r
b
gcd(a,b)=a\ xor\ b
gcd(a,b)=a xor b必有
a
−
c
=
a
x
o
r
c
a−c=a\ xor\ c
a−c=a xor c
证
明
过
程
证明过程
证明过程
还是比较好理解的。同学写了证明过程↑,可以直接进去。
所以就枚举
c
c
c,由于
c
c
c是
a
a
a的一个因数(
g
c
d
(
a
,
b
)
=
c
gcd(a,b)=c
gcd(a,b)=c中可以得出),所以再枚举
c
k
=
a
ck=a
ck=a然后判断即可。
代码:
#include <cstdio>
#define R register
using namespace std;
int n,sum;
int main()
{
scanf("%d",&n);
for (R int c=1;c<=n;c++)
for (R int i=2;c*i<=n;i++)
{
int a=c*i;
if (a-c==(a^c)) sum++;
}
printf("%d\n",sum);
return 0;
}
本文探讨了一个独特的数学问题,即在给定范围内寻找满足特定条件的无序数对(a,b),其中条件为两数的最大公约数等于两数的异或运算结果。通过巧妙的数学证明和算法设计,文章提出了一种有效的枚举方法来解决这一问题。
403

被折叠的 条评论
为什么被折叠?



