思路:
假设0到n-1之间的数为密码,则可以想到一个可行的解法:
第一次输出0,之后的每一次都输出 ( i − 1 ) ⊕ ( i − 2 ) (i-1)⊕(i-2) (i−1)⊕(i−2)。
假设答案为x,那么第一次输出0,答案变为0⊕x;
第二次输出0⊕1,那么答案就变为0⊕x⊕0⊕1,即x⊕1;
第三次变为x⊕2
…
以上利用异或的性质,可以在n次询问中获得答案。
#include<bits/stdc++.h>
#include<ctime>
using namespace std;
#define ll long long
const int mod = 998244353;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
for(int i = 0; i < n; i++)
{
if(i == 0)
{
cout<<i<<endl;
}
else
{
cout<<(i^(i-1))<<endl;
}
fflush(stdout) or cout.flush();
int flag = 0;
scanf("%d",&flag);
if(flag)break;
}
}
}