아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

CATS

시간 제한2초메모리 제한512 MB

요약
X, L, N이 주어지면 비트 반전이 있는 버그 있는 두 스택 카운터 프로그램을 시뮬레이션해서 출력하는 수를 구합니다.
난이도

보통10점 중 7점

유형
시뮬레이션, 스택, 비트 연산, 수학
정답자
아직 제출이 없습니다

문제

CATS(Counter and Two Stacks)는 카운터 COUNTER와 두 스택 S1, S2를 다루는 난해한 언어이다. 두 스택은 처음에 무한히 많은 00으로 채워져 있다.

PUSH는 값을 넣고, POP은 꺼낸다. ADD는 위에서 두 값을 더해 다시 넣는다. 음수를 PUSH하려 하면 값은 들어가지 않고, 그 스택의 모든 원소(무한 꼬리 포함)의 최하위 비트가 뒤집힌다 (X⊕1X \oplus 1).

Mr. Panda는 XX, LL, NN을 받아 LL보다 큰 NN의 배수 중 XX번째를 출력하려 했지만, 아래 버그 있는 의사코드는 다른 값을 출력한다. LL은 NN의 배수가 아니다.

COUNTER = X
WHILE COUNTER > 0
     S2 PUSH T1
     S1 POP
     FLIP LAST BINARY BIT OF ALL NUMBERS IN S1
     IF T2 > L
          COUNTER = COUNTER - 1
          IF COUNTER == 0 PRINT T2
     ELSE
          S2 PUSH N
          S2 PUSH N
          S2 ADD
          S2 ADD
          S1 PUSH T2
          S1 PUSH T2
          S2 POP
          S2 POP

T1, T2는 각각 S1, S2의꼭짓값이다. ELSE 블록 안의 S1 PUSH T2는 ADD 이후의 T2를 쓴다. 각 쿼리마다 의사코드가 출력하는 정수를 구하라.

입력

첫 줄에 쿼리 수 QQ가 주어진다.

다음 QQ줄에 XX, LL, NN이 주어진다. LL은 NN의 배수가 아니다.

출력

각 쿼리에 대해 의사코드가 출력하는 정수를 한 줄에 하나씩 출력한다.

힌트

무한 00 꼬리는 하나의 패리티 비트로 두고, 유한 접두사만 배열로 저장한다. FLIP과 음수 PUSH는 꼬리 비트와 접두사 전체에 XOR 11을 적용한다. POP으로 접두사가 비면 꼬리만 남는다.

예제3

  1. 예제 1

    입력
    2
    4 5 2
    18 6 4
    
    예상 출력
    8
    9
    
  2. 예제 2

    입력
    1
    4 5 2
    
    예상 출력
    8
    
  3. 예제 3

    입력
    1
    18 6 4
    
    예상 출력
    9