思路:
x是一个0-214 -1的数,那么转换成二进制它不会超过14位,所以我们可以用14位的二进制数表示它。
为什么要用14位的二进制数去表示他呢,因为1-100刚好是不会超过7位。
我们构造两个序列,第一个序列 A 的范围是1-100,x^A 中的任何一个数,前面7位数不变,因为A中的任何一个数前7位都是0,一个数 ^ 0结果不变。 那么我们就可以得到 前面7位数。
再构造 第二个序列 后面7 位都是0,同样的方法可以得到后面7位数,前面7位数和后面7位数都得到了,那么结果就弄在一起就好了。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cout << "? ";
for (int i = 1; i <= 100; i++)
{
cout << i << " ";
}
cout << endl;
int a;
cin >> a;
cout << "? ";
for (int i = 1; i <= 100; i++) cout << (i << 7) << " ";
cout << endl;
int b;
cin >> b;
// a 是用x^A中的任意一个数得到的,我们只需要前面七位,右移七位再左移七位即可
// b 是用X^B中的任意一个数得到的,我们只需要后面七位, 这里用&运算实现
cout << "! "<<((a >> 7 << 7) | (b & 127)) << endl;
return 0;
}✳
谢谢你读到这里。
更新于 2022-10-01