생일 선물
시간 제한1초메모리 제한128 MB
각자의 최대 지불 한도 내에서 총액이 선물 가격과 같아지도록 정수 금액을 배분하면서, 공평 몫과의 차이를 사전식으로 최소화하고 남은 동률은 한도와 입력 순서로 해결하는 문제입니다.
문제
오늘은 선영이의 생일이고, 친구들은 선영이에게 스타크래프트 II를 생일 선물로 사 주기로 했다.
친구들은 선물 값을 공정하게 나누어 내기로 했다. 다만 형편이 저마다 다르므로, 누구도 자신이 낼 수 있는 최대 금액보다 많이 내지는 않는다. 모든 사람은 1원 단위의 정수 금액만 낼 수 있으며(분수 금액은 낼 수 없다), 적어도 1원은 내야 한다.
선물 값이 이고 친구가 명일 때, 한 사람의 공정한 몫은 이다. 공정하게 나누기 위해, 각 사람이 낸 금액과 의 차이 중 최댓값을 최소로 만든다. 이렇게 해도 여러 방법의 최댓값이 같다면 그다음으로 큰 차이를 최소로 하고, 또 같다면 그다음 차이를 최소로 하는 식으로 계속한다.
각 사람은 최소 1원만 내면 되므로 위 조건을 만족하는 분배 방법이 여러 가지일 수 있다. 이 경우에는 더 많은 금액을 낼 수 있는 사람(최대 금액이 큰 사람)이 더 많이 낸다. 그래도 방법이 여러 가지이면 목록에서 앞에 있는 사람이 더 많이 낸다.
각 친구가 낼 수 있는 최대 금액과 선물 값이 주어질 때, 각 사람이 내야 하는 금액을 구하는 프로그램을 작성하시오. 선물 값을 정확히 모을 수 있는 방법이 전혀 없다면 대신 IMPOSSIBLE을 출력한다.
입력
첫째 줄에 테스트 케이스의 개수 가 주어진다. ()
각 테스트 케이스는 두 줄로 이루어진다. 첫째 줄에는 선물 값 와 친구의 수 이 공백으로 구분되어 주어진다. (, ) 둘째 줄에는 각 친구가 낼 수 있는 최대 금액 이 공백으로 구분되어 주어진다. ()
출력
각 테스트 케이스마다 한 줄에, 각 사람이 내야 하는 금액을 입력에 주어진 순서대로 공백으로 구분하여 출력한다. 선물 값을 공정하게 모을 수 있는 방법이 없다면 그 줄에 IMPOSSIBLE을 출력한다.