카드 재배열

면접 대비

시간 제한1초메모리 제한128 MB

요약
1, 2, ..., 2n 순서로 쌓인 카드에 컷과 리플 셔플을 주어진 순서대로 적용한 뒤 최종 카드 배열을 위에서부터 출력한다.
난이도

쉬움10점 중 3점

유형
시뮬레이션, 구현, 배열
정답자
아직 제출이 없습니다

문제

11부터 2n2n까지의 수가 적힌 카드 2n2n장이 있으며, 위에서부터 1,2,3,…,2n1, 2, 3, \dots, 2n의 순서로 쌓여 있다.

이 카드 더미를 다음 두 가지 방법을 여러 번 사용하여 재배열한다.

정수 kk로 컷 (cut)

위에서부터 kk장을 더미 AA로, 나머지 카드를 더미 BB로 나눈 뒤, 더미 AA 위에 더미 BB를 올린다. 즉 재배열한 뒤에는 위에서부터 더미 BB의 카드가 오고, 그 아래에 더미 AA의 카드가 놓인다.

리플 셔플 (riffle shuffle)

위에서부터 nn장을 더미 AA로, 나머지 nn장을 더미 BB로 나눈 뒤, 위에서부터 AA의 11번째, BB의 11번째, AA의 22번째, BB의 22번째, …\dots, AA의 nn번째, BB의 nn번째 순서가 되도록 하나의 더미로 합친다.

주어지는 지시에 따라 카드를 모두 재배열한 뒤, 카드의 번호를 위에서부터 순서대로 출력하는 프로그램을 작성하라.

입력

  • 첫째 줄에 nn (1≤n≤1001 \le n \le 100)이 주어진다. 즉 카드의 장수는 2n2n장이다.
  • 둘째 줄에 연산의 횟수 mm (1≤m≤10001 \le m \le 1000)이 주어진다.
  • 셋째 줄부터 m+2m+2째 줄까지 mm개의 줄에 걸쳐 00 이상 2n−12n-1 이하의 정수 kk가 한 줄에 하나씩 주어지며, 카드를 재배열하는 방법을 순서대로 지정한다.
    • k=0k = 0이면 리플 셔플을 수행한다.
    • 1≤k≤2n−11 \le k \le 2n-1이면 kk로 컷을 수행한다.

출력

2n2n개의 줄을 출력한다. 첫째 줄에는 모든 재배열이 끝난 뒤 가장 위에 있는 카드의 번호를, 둘째 줄에는 위에서 두 번째 카드의 번호를 출력하며, 일반적으로 ii째 줄에는 위에서 ii번째 카드의 번호를 출력한다.

예제2

  1. 예제 1

    입력
    2
    2
    1
    0
    
    예상 출력
    2
    4
    3
    1
    
  2. 예제 2

    입력
    3
    4
    2
    4
    0
    0
    
    예상 출력
    1
    5
    4
    3
    2
    6