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

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

토너먼트 우승 배치 세기

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

요약
고정된 대진표에 N명의 선수를 배치하는 N!가지 경우 중 각 선수가 우승하는 배치 수를 승패표가 주어졌을 때 센다.
난이도

보통10점 중 7점

유형
동적 계획법, 조합론, 비트 연산, 분할 정복
정답자
아직 제출이 없습니다

문제

N명이 참가하는 단판 승부 토너먼트가 있다. N은 2의 거듭제곱이다. 참가자를 0번부터 N-1번까지 번호가 붙은 자리에 한 명씩 배치하면, 1라운드에서는 자리 0과 자리 1, 자리 2와 자리 3처럼 이웃한 두 자리가 맞붙는다. 각 경기의 승자만 다음 라운드로 올라가고, 한 명이 남을 때까지 같은 방식으로 진행한다.

N = 8일 때의 대진표는 다음과 같다. 왼쪽의 숫자는 자리 번호이다.

0 --+
    +--+
1 --+  |
       +--+
2 --+  |  |
    +--+  |
3 --+     |
          +-- 우승
4 --+     |
    +--+  |
5 --+  |  |
       +--+
6 --+  |
    +--+
7 --+

두 사람이 맞붙었을 때 누가 이기는지는 미리 정해져 있다. 그래서 배치가 정해지면 우승자도 하나로 정해진다.

각 사람이 우승하는 배치가 몇 가지인지 세는 프로그램을 작성하시오. 배치는 N명을 N개의 자리에 나열한 순열이고, 한 자리라도 다르면 다른 배치로 센다. 전체 배치의 수는 N!N!이다.

입력

첫째 줄에 참가자 수 N이 주어진다. (2≤N≤162 \le N \le 16, N은 2의 거듭제곱)

다음 N개의 줄에 경기 결과표가 주어진다. 위에서 i번째 줄(0부터 센다)의 j번째 글자(0부터 센다)는 i번 사람과 j번 사람이 맞붙었을 때의 결과이다. 이 글자가 Y이면 i번 사람이 이기고, N이면 j번 사람이 이긴다.

i번째 줄의 i번째 글자는 항상 N이다. 서로 다른 i와 j에 대해 i번째 줄의 j번째 글자와 j번째 줄의 i번째 글자 중 정확히 하나만 Y이다.

출력

첫째 줄에 0번 사람부터 N-1번 사람까지 각 사람이 우승하는 배치의 수를 공백 하나로 구분해 차례대로 출력한다. 답은 최대 16!=2092278988800016! = 20922789888000이므로 64비트 정수가 필요하다.

예제3

  1. 예제 1

    입력
    2
    NN
    YN
    
    예상 출력
    0 2
    
  2. 예제 2

    입력
    4
    NYNY
    NNYN
    YNNY
    NYNN
    
    예상 출력
    8 0 16 0
    
  3. 예제 3

    입력
    8
    NYNYNYNY
    NNYNYNYY
    YNNNNNNN
    NYYNNYNY
    YNYYNYYY
    NYYNNNNN
    YNYYNYNN
    NNYNNYYN
    
    예상 출력
    4096 8960 0 2048 23808 0 1408 0