← 所有笔记

E. XOR Guessing 交互题

E. XOR Guessing 交互,构造,位运算

E. XOR Guessing

思路:

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

搜索笔记

搜索文章标题、标签和正文。

↑ ↓ 选择 · Enter 阅读Esc 关闭