Sheriruth

시간 제한5초메모리 제한1024 MB

요약
n과 m을 받은 뒤 최대 20번의 질의로 각 B_x 값을 알아내고, x+y+z=2^n-1이며 비트가 겹치지 않는 세 수 가운데 커버 조건을 깨는 것을 찾아야 하는 인터랙티브 문제이다.
난이도

어려움10점 중 9점

유형
비트 연산, 조합론, 수학, 게임 이론
정답자
아직 제출이 없습니다

문제

이 문제는 인터랙티브 문제이다.

주어진 양의 정수 n≤15n\le 15과, 1≤m≤2n1\le m\le 2n에 대해서, RUN game이라는 것은 "방어자"가 "공격자"의 공격을 방어하는 컨셉으로 이루어지는 2인용 경쟁 게임이다. 그 진행방식은 다음과 같이 기술된다:

  1. 방어자는 모든 1≤t≤2n−11\le t\le 2^n-1에 대해서, tt의 길이 nn의 이진전개를 A_tA\_t이라고 할 때, A_tA\_t에서 00인 값들을 적절히 22로 바꾸어 어떤 00부터 22 사이의 값을 가지는 길이 nn의 수열 B_tB\_t를 만든다.
  2. 공격자는 세 정수 1≤x,y,z≤2n−11\le x,y,z\le 2^n-1를 선택한다. 이 세 정수는 x+y+z=2n−1x+y+z=2^n-1을 만족해야 하며, x,y,zx,y,z중 어느 두 정수를 뽑더라도 이 둘의 bitwise AND는 00이어야 한다. 즉, x,y,zx,y,z는 2n−12^n-1의 비트를 적절히 나누어가진 세 정수여야 한다. 만약 이렇게 선택한 x,y,zx,y,z에 대해서, 다음의 조건이 성립하지 않는다면 공격자는 이 세 정수의 이진전개를 선언하고 승리한다. 그렇지 않다면 방어자가 승리한다.

조건: 임의의 1≤i≤n1\le i\le n에 대해서, B_x,B_y,B_zB\_x,B\_y,B\_z중 적어도 하나는 ii번째 원소가 22이다. 또한, B_x,B_y,B_zB\_x,B\_y,B\_z에 속한 22의 개수의 총합이 mm 이하여야 한다.

히카리와 타이리츠는 RUN game을 플레이하려고 한다. 이들의 게임은 다음과 같이 진행될 것이다.

일단, 맨 처음 n,mn,m이 주어지고 나면 타이리츠는 공격자를 할지 방어자를 할지 결정한다.

타이리츠가 방어자를 하기로 결정했다면, 일반적인 RUN game의 룰대로 타이리츠는 히카리에게 2n−12^n-1개의 수열을 제공하고, 히카리는 그중 조건을 만족하지 않는 x,y,zx,y,z를 찾는다.

그러나, 타이리츠가 공격자를 하기로 결정했다면, 타이리츠는 11 이상 2n−12^n-1 이하인 xx에 대해 히카리에게 다음과 같은 질문을 최대 2020개 할 수 있다:

  • ? A_xA\_x: 히카리가 생각한 B_xB\_x를 반환받는다.

최대 2020번의 질문 이내에 만약 타이리츠가 조건을 만족하지 않는 x,y,zx,y,z를 찾았다면, 타이리츠는 그 이진전개를 선언하고 승리할 수 있다. 만약 2020번 이내에 이를 찾지 못했다면, 히카리가 승리한다.

타이리츠의 전략을 수행하는 프로그램을 작성하여라.

제한

  • 3≤n≤153\le n\le 15
  • 1≤m≤2n1\le m\le 2n

힌트

어떤 정수 0≤t<2n0\le t<2^n에 대해서, tt의 길이 nn의 이진전개라는 것은 길이 nn의 이진수열 a_na_n−1...a_1a\_na\_{n-1}...a\_1인데, 이때 a_ia\_i는 ⌊t2i−1⌋\left\lfloor \frac{t}{2^{i-1}} \right\rfloor가 홀수라면 11이고, 그렇지 않다면 00이다. 간단히 말해서, a_ia\_i는 tt의 ii번째 비트이다.

출력 버퍼를 비우는 방법은 다음과 같다.

  • C: fflush(stdout)
  • C++: std::cout << std::flush
  • Java: System.out.flush()
  • Python: sys.stdout.flush()

이외의 언어에 대해서는 언어별 명세를 참고해야 한다.

예제2

  1. 예제 1

    입력
    3 6
    
    예상 출력
    
    0
    221
    212
    211
    122
    121
    112
    111
    
  2. 예제 2

    입력
    3 2
    
    021
    
    212
    
    100
    
    예상 출력
    
    1
    ? 001
    
    ? 010
    
    ? 100
    
    ! 010 001 100