10.29 C

本文深入探讨了使用位运算和最大公约数(gcd)解决特定数学问题的高效方法。通过分析x与y的关系,我们发现当x xor y等于x减y时,该情况与gcd(x,y)相等,这一洞察为解决问题提供了新的视角。文章还提供了C++实现代码,强调了正确使用括号以调整运算顺序的重要性。

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

题目:

解题思路:

x>yx>yx>y
gcd(x,y)gcd(x, y)gcd(x,y) === gcd(x,x−y)gcd(x, x - y)gcd(x,xy)
gcd(x,y)gcd(x, y)gcd(x,y) ≤≤ x−yx - yxy
又∵xxx xorxorxor yyy ≥≥ x−yx - yxy
∴当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 - yxy
因为gcdgcdgcd的时间复杂度比xorxorxor高很多,O(log2(n))O(log2(n))O(log2(n)), 所以我们枚举当xxx xorxorxor yyy === x−yx - yxy时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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值