CF1543D1 RPD and Rap Sheet (Easy Version)
阿新 • • 發佈:2021-08-22
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; }
好短~
看不見我看不見我看不見我