本题看起来很难,因为没做过交互题
一眼看去,其实一个数就可以猜出来了。。。。。。
但我们要填满100个输入位。。。。
我们发现0作为异或的时候,满足原来
为1,则(1xor0=1)
为0,则(0xor1=0)
所以,当我们选的数都是0的时候便可以保证得知原来的数字
—————————————————————————————————————————————
100个数怎么构造呢?
其实我们拿任意7个数出来,是可以超过100个数的
而2*7刚好等于14,所以我们一次固定7个数位为0
——————————————————————————————————————————————
#include<bits/stdc++.h>
using namespace std;
const int N=200;
int in[N],ans[20];
int fir,sec;
int main(){
for(int i=0;i<128;i++){in[i]=i;}
printf("? ");
for(int i=1;i<=100;i++)printf("%d ",in[i]);
puts("");
fflush(stdout);
scanf("%d",&fir);
int tmp=(fir>>7),num=8;
while(num<=14)
{
ans[num++]=tmp%2;
tmp>>=1;
}
printf("? ");
for(int i=1;i<=100;i++){
int out=(in[i]<<7);
printf("%d ",out);
}
puts("");
fflush(stdout);
scanf("%d",&sec);
tmp=sec,num=1;
while(num<=7){
ans[num++]=tmp%2;
tmp>>=1;
}
int two=1,ansout=0;
for(int i=1;i<=14;i++){
ansout+=two*ans[i];
two*=2;
}
printf("! %d",ansout);
}