커플 파괴자 민욱이 (Large)
시간 제한1초메모리 제한1024 MB
줄을 가장 적은 수의 연속 묶음으로 나눈 뒤 묶음 순서를 바꾸어 어떤 커플도 이웃하지 않게 하고, 가능한 방법을 최대 100가지 출력한다.
문제
'커플 파괴자 민욱이'는 솔로이기 때문에 커플끼리 함께 있는 모습을 보기 싫어한다. 그러한 민욱이가 사람들 명이 일렬로 서 있는 대기 줄 하나를 발견했다. 민욱이는 이 대기 줄을 개의 묶음으로 나눈 뒤, 묶음의 순서를 바꾸어 어떠한 커플끼리도 이웃하지 않게 할 것이다. 각 묶음의 사람 수는 일정하지 않고 서로 달라도 된다. 단, 같은 묶음에 있는 사람들끼리의 순서를 바꾸거나 거꾸로 뒤집을 수는 없다.
이 크다면 묶음의 순서를 바꾸는 민욱이의 머리가 아플 것이기 때문에 이 최소가 되게 하려고 한다. 그리고 민욱이는 이 최소일 때의 가능한 방법의 개수를 라고 할 때, 가능한 여러 가지 방법 중 아무거나 가지를 구하려고 한다. 각 묶음의 사람 수가 모두 같더라도 묶음을 배열하는 순서가 다르다면 다른 방법으로 치고, 묶음을 배열하는 순서가 같더라도 각 묶음의 사람 수가 하나라도 다르다면 다른 방법으로 친다.
입력
번째 줄에 사람들의 수를 나타내는 정수 이 주어진다.
번째 줄에 각 사람의 정보를 나타내는 정수 이 공백으로 구분되어 주어진다. 는 대기 줄의 앞에서부터 번째에 서 있는 사람의 정보를 나타낸다. 이라면 그 사람이 솔로임을, 이고 이라면 두 사람이 커플임을 의미한다. 이 아닌 수가 에 존재한다면 그 수는 무조건 두 번 존재한다.
출력
각 묶음의 번호를 대기 줄의 앞에서부터 이라고 매길 때,
번째 줄에는 의 최솟값을 출력한다.
그리고 번째 줄부터 번째 줄까지는 아래의 형식에 맞춰 가능한 방법을 총 가지 출력한다.
번째 줄에는 번째 방법에서 번 묶음, 번 묶음, 번 묶음, , 번 묶음의 사람 수를 공백으로 구분하여 출력한다.
번째 줄에는 번째 방법에서 묶음의 순서를 바꿨을 때 대기 줄의 앞에서부터 묶음의 번호를 출력한다.
만약 의 값이 보다 작은 경우에는 번째 줄에 을 출력하고 그다음 줄부터는 아무것도 출력하지 않는다.
만약 대기 줄을 몇 묶음으로 나누고 어떻게 배열하더라도 항상 한 커플 이상이 이웃한다면 번째 줄에 을 출력하고 그다음 줄부터는 아무것도 출력하지 않는다.