#ATarc070d. [ARC070F] HonestOrUnkind

[ARC070F] HonestOrUnkind

题目描述

problemUrl

这是一道交互式问题。

鹿 AtCoDeer 君发现有 NN 个人聚集在一起,每个人的编号分别为 00N1N-1。其中有 AA 个人是诚实者,剩下的 B(=NA)B(=N-A) 人是不诚实者。这 NN 个人都清楚每个人究竟是诚实者还是不诚实者。而 AtCoDeer 君只知道有 AA 个诚实者和 BB 个不诚实者,其余信息一无所知。于是,他打算通过对这 NN 个人提问,从而确定所有诚实者的编号。

每次提问,AtCoDeer 君可以选择两个整数 aabb0a,bN10 \leq a, b \leq N-1),并向编号为 aa 的人提问:“编号为 bb 的人是诚实者吗?”

诚实者总是会对问题给出 Yes 或 No 的正确回答。而不诚实者则会任意地选择 Yes 或 No 回答。也就是说,他们既可能总说谎,也可能随机作答,甚至可能采用其他非简单的欺骗策略。

AtCoDeer 君最多可以进行 2×N2\times N 次提问。提问过程是顺序进行的,可以根据之前得到的结果来决定后续的问题。

请你确定所有诚实者的身份。如果无法做到(更准确地说,即使不管怎么问 2×N2\times N 次,不诚实者总能通过一种回答策略使得诚实者集合的可能情况大于等于 22 种),请输出相应的信息。

输入格式

首先,标准输入会给出 AABB 两个由空格隔开的整数,格式如下:

AA BB

如果无法确定所有的诚实者,应立即输出下述内容并终止程序:

Impossible

其他情况下,可以进行询问。每个询问应在标准输出输出如下格式:

? aa bb

其中 aabb 均为 00N1N-1 的整数。

接着,本次询问的回答会从标准输入给出,格式如下:

ansans

其中 ansansYNY 表示答案为 Yes,N 表示答案为 No。

最后,你应输出以下内容来交出最终答案:

! s0s1...sN1s_0s_1...s_{N-1}

其中 sis_i 在编号为 ii 的人是诚实者时为 1,否则为 0

输出格式

无特定输出格式要求,交互内容已在输入格式中给出。

样例 1

输入

2 1

N

Y

Y

Y

Y

输出

? 0 1

? 0 2

? 1 0

? 2 0

? 2 2

! 101

样例 2

输入

1 2

输出

Impossible

说明/提示

数据范围

  • 1A,B20001 \leq A, B \leq 2000

评测说明

  • 每次输出后,必须刷新标准输出。 否则可能出现 TLE
  • 输出最终答案后,必须立即终止程序,未按要求终止程序的行为未定义。
  • 如果输出的答案错误,评测器的行为未定义(不一定是 WA)。

样例解释 #1

此样例中,A=2A = 2B=1B = 1,答案是 101

样例解释 #2

此样例中,A=1A = 1B=2B = 2,答案为 Impossible