생일 선물

시간 제한1초메모리 제한128 MB

요약
각자의 최대 지불 한도 내에서 총액이 선물 가격과 같아지도록 정수 금액을 배분하면서, 공평 몫과의 차이를 사전식으로 최소화하고 남은 동률은 한도와 입력 순서로 해결하는 문제입니다.
난이도

보통10점 중 7점

유형
그리디, 이분 탐색, 정렬
정답자
아직 제출이 없습니다

문제

오늘은 선영이의 생일이고, 친구들은 선영이에게 스타크래프트 II를 생일 선물로 사 주기로 했다.

친구들은 선물 값을 공정하게 나누어 내기로 했다. 다만 형편이 저마다 다르므로, 누구도 자신이 낼 수 있는 최대 금액보다 많이 내지는 않는다. 모든 사람은 1원 단위의 정수 금액만 낼 수 있으며(분수 금액은 낼 수 없다), 적어도 1원은 내야 한다.

선물 값이 pp이고 친구가 nn명일 때, 한 사람의 공정한 몫은 p/np / n이다. 공정하게 나누기 위해, 각 사람이 낸 금액과 p/np / n의 차이 중 최댓값을 최소로 만든다. 이렇게 해도 여러 방법의 최댓값이 같다면 그다음으로 큰 차이를 최소로 하고, 또 같다면 그다음 차이를 최소로 하는 식으로 계속한다.

각 사람은 최소 1원만 내면 되므로 위 조건을 만족하는 분배 방법이 여러 가지일 수 있다. 이 경우에는 더 많은 금액을 낼 수 있는 사람(최대 금액이 큰 사람)이 더 많이 낸다. 그래도 방법이 여러 가지이면 목록에서 앞에 있는 사람이 더 많이 낸다.

각 친구가 낼 수 있는 최대 금액과 선물 값이 주어질 때, 각 사람이 내야 하는 금액을 구하는 프로그램을 작성하시오. 선물 값을 정확히 모을 수 있는 방법이 전혀 없다면 대신 IMPOSSIBLE을 출력한다.

입력

첫째 줄에 테스트 케이스의 개수 TT가 주어진다. (1≤T≤1001 \le T \le 100)

각 테스트 케이스는 두 줄로 이루어진다. 첫째 줄에는 선물 값 pp와 친구의 수 nn이 공백으로 구분되어 주어진다. (1≤p≤1,000,0001 \le p \le 1{,}000{,}000, 2≤n≤1002 \le n \le 100) 둘째 줄에는 각 친구가 낼 수 있는 최대 금액 a1,a2,…,ana_1, a_2, \dots, a_n이 공백으로 구분되어 주어진다. (1≤ai≤1,000,0001 \le a_i \le 1{,}000{,}000)

출력

각 테스트 케이스마다 한 줄에, 각 사람이 내야 하는 금액을 입력에 주어진 순서대로 공백으로 구분하여 출력한다. 선물 값을 공정하게 모을 수 있는 방법이 없다면 그 줄에 IMPOSSIBLE을 출력한다.

예제8

  1. 예제 1

    입력
    3
    20 4
    10 10 4 4
    7 3
    1 1 4
    34 5
    9 8 9 9 4
    
    예상 출력
    6 6 4 4
    IMPOSSIBLE
    8 7 8 7 4
    
  2. 예제 2

    입력
    1
    8 4
    2 2 2 2
    
    예상 출력
    2 2 2 2
    
  3. 예제 3

    입력
    1
    100 3
    10 10 10
    
    예상 출력
    IMPOSSIBLE
    
  4. 예제 4

    입력
    1
    2 3
    5 5 5
    
    예상 출력
    IMPOSSIBLE
    
  5. 예제 5

    입력
    1
    40 4
    1 1 1 100
    
    예상 출력
    1 1 1 37
    
  6. 예제 6

    입력
    1
    10 4
    5 5 5 5
    
    예상 출력
    3 3 2 2
    
  7. 예제 7

    입력
    1
    23 5
    3 10 10 10 3
    
    예상 출력
    3 6 6 5 3
    
  8. 예제 8

    입력
    1
    30 3
    10 10 10
    
    예상 출력
    10 10 10