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