1. 程式人生 > 其它 >CF1543D1 RPD and Rap Sheet (Easy Version)

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;
}

好短~

看不見我看不見我看不見我