XOR Guessing(CF 1207 E)
题目大意
这是一道交互题。有一个未知数\(x\),你只能询问两次,每次询问\(100\)个数\(a_1,a_2,\dots,a_{100}\),且这\(200\)个数不能重复,每次询问,会返回\(x\)异或上询问的\(100\)个数中其中一个的结果,最后让你输出这个数\(x\)是多少。\((0\le x\le 2^{14}-1)\)
思路
这题感觉思路还是挺妙的,我们把这个数分成前\(7\)位和后\(7\)位来看,这样只要保证第一次询问的所有数的前\(7\)位都为\(0\),则就能知道这个数的前\(7\)位了,后\(7\)位亦然,于是这道题就结束了。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
cout<<"? ";
for(long long i=1;i<=100;i++)cout<<i<<" ";
cout<<endl;
fflush(stdout);
long long x1;cin>>x1;
cout<<"? ";
for(long long i=1;i<=100;i++)cout<<(i<<7)<<" ";
cout<<endl;
fflush(stdout);
long long x2;cin>>x2;
x1>>=7;x1<<=7;
x2%=(1<<7);
cout<<"! "<<x1+x2<<endl;
return 0;
}