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

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

그래프 색칠 2

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

요약
정점이 18개 이하인 그래프에서 공집합이 아닌 모든 부분집합의 색칠수를 구한 뒤 하나의 해시값으로 접어 출력한다.
난이도

어려움10점 중 8점

유형
동적 계획법, 비트 연산, 완전 탐색, 그래프
정답자
아직 제출이 없습니다

문제

nn개의 정점이 00부터 n−1n - 1까지 번호가 붙은 무방향 그래프가 주어진다. 정점 집합의 공집합이 아닌 부분집합은 당연히 2n−12^n - 1개이다. 공집합이 아닌 부분집합 SS의 적절한 색칠은 SS의 각 정점에 색을 부여하되, SS 안에서 같은 색을 가진 두 정점이 간선으로 직접 연결되지 않도록 하는 방법이다. 적절한 색칠에서 서로 다른 색을 kk가지 사용했다고 하자. 부분집합 SS의 색칠수는 SS의 모든 적절한 색칠 중 가능한 kk의 최솟값이다.

이제 nn개 정점의 공집합이 아닌 모든 부분집합의 색칠수를 계산해야 한다.

입력

첫째 줄에 정수 TT가 주어진다. 그다음 TT개의 테스트 케이스가 이어진다.

각 테스트 케이스의 첫째 줄에는 정수 nn이 주어진다. 그다음 nn개의 줄에는 각각 '0'과 '1'로 이루어진 문자열이 주어진다. 0≤i≤n−10 \le i \le n - 1이고 0≤j≤n−10 \le j \le n - 1일 때, ii번째 줄의 jj번째 문자가 '1'이면 정점 ii와 jj가 간선으로 직접 연결되어 있고, 그렇지 않으면 연결되어 있지 않다.

ii번째 줄의 ii번째 문자는 항상 '0'이다. jj번째 줄의 ii번째 문자는 항상 ii번째 줄의 jj번째 문자와 같다.

모든 테스트 케이스에 대해 1≤n≤181 \le n \le 18이다. 1≤n≤101 \le n \le 10인 테스트 케이스는 100100개 이하이고, 11≤n≤1511 \le n \le 15인 테스트 케이스는 33개 이하이며, 16≤n≤1816 \le n \le 18인 테스트 케이스는 22개 이하이다.

출력

각 테스트 케이스마다 정수를 한 줄에 하나씩 출력한다. 이 정수는 다음과 같이 정해진다. 부분집합 SS의 식별 번호를 id(S)=∑_v∈S2v\mathit{id} (S) = \sum\_{v \in S} 2^v로 정의한다. SS의 색칠수를 f_id(S)f\_{\mathit{id} (S)}라 하자. 다음 값을 출력해야 한다. (∑_id(S)=12n−1f_id(S)⋅233id(S)) mod 232.\left(\sum\limits\_{\mathit{id} (S) = 1}^{2^n - 1} f\_{\mathit{id} (S)} \cdot 233^{\mathit{id} (S)}\right) \bmod 2^{32}\text{.}

힌트

첫 번째 테스트 케이스에서 ans\[1..15]=1,1,2,1,2,2,3,1,1,1,2,2,2,2,3ans\[1..15] = \\{1, 1, 2, 1, 2, 2, 3, 1, 1, 1, 2, 2, 2, 2, 3\\}이다.

예제1

  1. 예제 1

    입력
    2
    4
    0110
    1010
    1101
    0010
    4
    0111
    1010
    1101
    1010
    
    예상 출력
    1022423354
    2538351020