CF1665D GCD Guess 题解
Upd on 2022.6.29:更正了一处小错误。
题目大意
交互题,需要猜一个正整数 (),每次询问输出给出 ,你可以得到 的值,询问此处不超过 次。要求 。
题目解析
显然 。
这样我们就可以猜出 在二进制下的每一位。
我们从低位到高位猜,假设现在猜的是从右往左第 位,那么我们现在就已经知道了右边 位,这些位的数值的和记作 ,令 ,。假设返回的数是 。 如果 ,也就是说,在第 位加上了 会产生进位,那么这一位就是 ,反之这一位就是 。
代码:
int x,tmp; void work(){ int i; x=0; for(i=1;i<=30;i++){ cout<<"? "<<(1<<i-1)-x<<' '<<(1<<i-1)+(1<<i)-x<<endl; fflush(stdout); cin>>tmp; if(tmp==(1<<i)) x|=1<<(i-1); //cout<<x<<endl; } cout<<"! "<<x<<endl; fflush(stdout); return; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析