n개 변수의 세 가지 참인 대입이 주어질 때, 그 세 대입만을 만족하는 500개 이하의 함의 제약을 구성한다.
보통6그래프구현조합론아직 제출이 없습니다시간 제한1초메모리 제한512 MB구스타프는 2-충족 가능성 문제(2-SAT)에 관한 글을 읽고 있다. 2-SAT은 불리언 변수에 참과 거짓 값을 배정해 제약 조건 목록을 모두 만족시키는 잘 알려진 문제이고, 각 제약 조건은 변수 두 개가 들어가는 간단한 논리식이다.
변수는 x1,x2,…,xn의 n개이며, 각 변수는 0(거짓) 또는 1(참) 값을 가진다. 제약 조건은 a→b 꼴의 식이고, a와 b는 각각 변수 또는 부정된 변수이다. 여기서 →는 논리적 함의이다. 즉 a→b는 a가 1이고 b가 0일 때만 0이다. 변수 a의 부정은 !a로 쓴다.
변수에 값을 배정했을 때 제약 조건의 값이 1이면 그 제약 조건이 만족된다고 한다. 구스타프는 제약 조건 목록을 만들었고, 모든 제약 조건을 만족하는 배정이 정확히 세 가지라는 사실을 올바르게 알아냈다. 그는 세 배정을 모두 적어 두었지만 안타깝게도 제약 조건 목록을 잃어버렸다.
변수 n개에 대한 배정 세 개가 주어진다. 주어진 세 배정만이 모든 제약 조건을 만족하는 배정이 되도록 하는, 제약 조건 500개 이하로 이루어진 목록을 구하라. 이런 목록은 여러 개일 수 있으므로 출력 절에 적힌 규칙으로 정해지는 목록 하나를 출력해야 한다.
첫째 줄에 변수의 개수 n (2≤n≤50)이 주어진다. 다음 세 줄에 배정이 한 줄에 하나씩 주어진다. k번째 줄에는 정수 n개 v1k,v2k,…,vnk가 공백으로 구분되어 주어진다. 각 vik는 0 또는 1이며, k번째 배정에서 변수 xi의 값이다. 세 배정은 모두 서로 다르다.
조건을 만족하는 목록이 없으면 정수 -1 하나만 한 줄에 출력한다.
그렇지 않으면 첫째 줄에 제약 조건의 개수 m (1≤m≤500)을 출력하고, 다음 m개 줄 중 k번째 줄에 k번째 제약 조건을 출력한다. 각 제약 조건은 다음 규칙으로 만든 문자열이다.
목록이 존재하면 다음 규칙으로 만든 목록을 그대로 출력해야 한다. 아래 식에서 i, j, r, p, q 자리에는 실제 변수 번호를 쓴다.
xi -> !xi를, 값이 1이면 !xi -> xi를 출력한다.xr -> xj와 xj -> xr을, 세 배정 모두에서 값이 다르면 xr -> !xj와 !xj -> xr을 이 순서대로 출력한다.A -> B를 하나 출력한다. 여기서 A는 u=1이면 xp, u=0이면 !xp이고, B는 w=1이면 !xq, w=0이면 xq이다.