【JZOJ4714】公约数【数论,数学】

本文探讨了一个独特的数学问题,即在给定范围内寻找满足特定条件的无序数对(a,b),其中条件为两数的最大公约数等于两数的异或运算结果。通过巧妙的数学证明和算法设计,文章提出了一种有效的枚举方法来解决这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

题目链接: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 ac=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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值