洛谷 P11145 Strange Homura Game 题解

题目传送门
题号真臭

一、大致思路

这道题和前面那道 B1 差别挺大,所以本蒟蒻只 A 了这道 B2。
首先有个数字 \(m\),你需要用两次输出来猜 \(m\)
由于 \(m\le10^{17},x\le4\times10^{18}\),输出的是 \(x\bmod m\) 的值,我们假设 \(x \bmod m=0\),那么显然 \((x-1)\bmod m=m-1\),只要将 \(m-1\) 的值增加 \(1\) 即可计算出 \(m\)
由于题目告诉你只能猜两次,我们就要在第一次让 \(x \bmod m=0\),但这样肯定是不行的,但是 \(x-(x\bmod m)\) 肯定是 \(m\) 的倍数,这样第二次的 \(x\) 肯定为第一次的 \(x-(x\bmod m)-1\),这样输出的结果加一就是正确答案。
我们让第一次的询问为 \(x\) 的上限范围 \(10^{18}\),再根据第一次的回答算出第二次的 \(x\)

二、AC 代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		long long n=0,k=0;
		cout<<"? 1000000000000000000"<<std::endl;//10^18
		cin>>n;
		cout<<"? "<<1000000000000000000-n-1<<std::endl;
		cin>>n;
		cout<<"! "<<n+1<<std::endl;
	}
	return 0;
}
posted @ 2024-10-04 08:55  fxwqctb  阅读(34)  评论(0)    收藏  举报