CF1665D GCD Guess

常规做法是 CRT,这里写一写更简单的做法。

gcd(x+a,x+b)=gcd(x+a,ba)

数据范围和猜测次数启示我们在二进制下一位一位的确定 x

为了消除高位对低位的影响,从低位到高位猜。

假设猜到了从右到左第 i 位,那么记前面的 i1 位组成的数值为 x

那么构造出 a=2i1xb=2i1+2ix

因为如果 i 位上是 0,那么 x+a 从右到左有 i10,所以当 gcd(x+a,x+b)=2i1 时,i 位为 0,否则为 1

#include <bits/stdc++.h>

typedef long long ll;

void solve() {
	int ans = 0;
	for(int i = 0; i < 30; ++i) {
		std::cout << "? " << (1 << i) - ans << " " << (1 << i) - ans + (1 << (i + 1)) << "\n";
		fflush(stdout);
		int x;
		std::cin >> x;
		if(x == (1 << (i + 1))) ans |= 1 << i;
	}
	std::cout << "! " << ans << "\n";
	fflush(stdout);
}

int main() {
	// std::ios::sync_with_stdio(false);
	// std::cin.tie(nullptr);
	int _;
	std::cin >> _;
	while(_--) solve();
	return 0;
}
posted @   Nylch  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示