问题描述
这是一个互动的问题。记住,在与测试程序通信时刷新输出。您可以使用c++中的fflush(stdout)、Java中的system.out.flush()、Python中的stdout.flush()或Pascal中的flush(output)来刷新输出。如果使用其他编程语言,请参考它的文档。您也可以参考交互式问题指南:https://codeforces.com/blog/entry/45307。
陪审团选择了一个不小于0且不大于214 - 1的整数x。你必须猜这个整数。
要做到这一点,您可以询问不超过2个查询。每个查询应该包含100个整数a1, a2,…, a100(每个整数应不小于0且不大于214−1)。在回答你的问题时,评审团会选择一个整数i(1≤i≤100),并告诉你ai⊕x的值(ai和x的位XOR)。
它保证x的值在每次测试之前都是固定的,但是每个查询中i的选择可能取决于您发送的整数。
输出
要给出答案,程序应该打印一行!x的末尾有一个换行符。之后,它应该刷新输出并优雅地终止。
交互
在给出答案之前,您最多可以提交两个查询。若要查询,请按以下格式打印一行:?a1 a2……a100,其中每个aj应该是[0,214 - 1]范围内的整数。行应该以换行符结束。提交查询后,刷新输出并读取查询的答案——对于某些i∈[1,100],ai⊕x的值。查询中不能多次使用整数。
如果您提交了一个不正确的查询(或询问了两个以上的查询),它的答案将是一个整数- 1。在收到这样的答案后,您的程序应该立即终止——否则您可能会收到“运行时错误”、“超过时间限制”或其他一些结论,而不是“错误的答案”。
Example
input
0
32
output
? 3 5 6
? 32 24 37
! 5
Note
交互的例子不正确——您应该在每个查询中精确地输出100个整数。其他的都是正确的。
分析:
第一次写交互题,有毒 。
搜了一波fflush():
1.fflush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃
2.fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上
题目给的数最多14位(二进制为0-13)
第一次直接输出7-13位为0的数(比如1-100),这样的话无论异或哪一个数都不影响7-13位,这样就能根据他给的数推出原来的数的7-13位。
第二次输出0-6位0的数(最简单的方法是把1-100位运算左移7位),这样无论异或哪个数都不影响0-6位,这样就能根据他给的数推出原来的数的0-6位。
两次就一定能推出原来的数了
每次输出的时候记得fflush(stdout),(输出最后答案的时候可以不用)
code:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
typedef long long ll;
const int inf=0x3f3f3f3f;
const int inn=0x80808080;
using namespace std;
int main(){
printf("? ");
for(int i=1;i<=100;i++){
printf(" %d",i);
}
puts("");
fflush(stdout);
//
int t;
scanf("%d",&t);
int ans=0;
for(int i=7;i<14;i++){
ans+=((t>>i&1)<<i);
}
//
printf("? ");
for(int i=1;i<=100;i++){
printf(" %d",i<<7);
}
puts("");
fflush(stdout);
//
scanf("%d",&t);
for(int i=0;i<7;i++){
ans+=((t>>i&1)<<i);
}
printf("! %d",ans);
fflush(stdout);//这个地方可以不加了
return 0;
}