CF1543D1 RPD and Rap Sheet (Easy Version)

CF1543D1 RPD and Rap Sheet (Easy Version)

怎么说呢~

这道题在做的时候,

我莫名的就TLE了,

可能是交互库写挂了...

这道题要求我们求出一个我们不知道且会变的数,

所以我们就需要利用它的性质.

这里它变的方式是异或,

在二进制下,

异或有一个性质,

就是互逆性,

也就是 \(a\ xor\ a = 0\) ,

所以我们就想到每次异或上两个数异或后的结果,

并且使得与上一次异或的结果抵消掉,

这不就很简单了嘛...

我们第一次异或 \(0\) ,

从第二次开始,

\(i\) 次就异或 \((i - 1)\ xor\ (i - 2)\) ,

然后我们每次都可以把上一次的异或抵消掉并且异或上一个新的数,

这样下去,

当我们异或到第 \(x\) 次时,

\(x\) 就变成了 \(x\ xor\ (x - 1)\) ,

我们第 \(x + 1\) 次询问的正是 \(x\ xor\ (x - 1)\) ,

因为我们有 \(n\) 次询问机会,

\(x\) 最大为 \(n - 1\) ,

这样我们就能保证在 \(n\) 次之内一定得出答案.

code:

#include <iostream>
using namespace std;
int main(){
    int t, n, k, y, i, ok;
    cin >> t;
    while (t--){
        cin >> n >> k; y = i = ok = 0;
        while (!ok){
            cout << y << "\n";
            i++;
            y = i ^ (i - 1);
            cout.flush();
            cin >> ok;
        }
    }
    return 0;
}

好短~

posted @ 2021-08-22 16:36  sshadows  阅读(31)  评论(0编辑  收藏  举报