바이너리 행렬
시간 제한5초메모리 제한128 MB
0과 1로 이루어진 행렬에서 최소 횟수로 원소를 뒤집어 모든 행의 1의 개수가 같고 모든 열의 1의 개수가 같도록 만들고, 불가능하면 -1을 출력한다.
문제
크기가 인 행렬이 주어진다. 행렬의 각 원소는 또는 이다. 한 번의 연산으로 원소 하나를 뒤집을 수 있다. 즉, 은 로, 은 으로 바꾼다. 이 연산을 여러 번 수행하여 다음 두 조건을 모두 만족하는 행렬을 만들려고 한다.
- 모든 행에 들어 있는 의 개수가 서로 같다.
- 모든 열에 들어 있는 의 개수가 서로 같다.
주어진 행렬을 위 두 조건을 만족하는 행렬로 바꾸는 데 필요한 연산의 최소 횟수를 구하여라.
입력
첫째 줄에 테스트 케이스의 개수 ()가 주어진다.
각 테스트 케이스의 첫째 줄에는 두 정수 과 ()가 주어진다. 은 행의 수, 는 열의 수이다. 이어지는 개의 줄에는 각각 개의 숫자가 공백 없이 주어지며, 이는 행렬의 각 원소를 나타낸다.
출력
각 테스트 케이스마다 Case #: R 형식으로 한 줄에 출력한다. 여기서 #는 테스트 케이스의 번호(부터 시작)이고, R은 주어진 행렬을 조건에 맞는 행렬로 바꾸는 데 필요한 연산의 최소 횟수이다. 바꾸는 것이 불가능한 경우에는 R 대신 을 출력한다.