양의 정수 a_i와 d가 주어질 때 합 a_i x_i = d를 만족하는 0이 아닌 x_i가 존재하는지 판정하고, 각 |D_i|를 최소로 만드는 규칙이 정한 유일한 수열을 출력한다.
어려움8정수론그리디수학구현아직 제출이 없습니다시간 제한2초메모리 제한512 MB땅요정 폴이 땅요정 수학 컵 예선 라운드에 나갔다. F번 문제는 다음과 같다.
양의 정수 n개 a1,a2,…,an과 양의 정수 d가 주어진다. 다음 식을 만족하면서 어느 것도 0이 아니고 ∣xi∣≤107인 정수 x1,x2,…,xn을 구하라.
a1x1+a2x2+⋯+anxn=d.
땅요정은 큰 수를 싫어하므로 모든 ai와 d는 106 이하이고, 어떤 xi도 0이 될 수 없다.
식을 만족하는 수열은 여러 개일 수 있어서 정답으로 인정하는 수열은 하나로 정해져 있다. sn+1=0으로 두고 i=n,n−1,…,1 순서로 si=gcd(ai,si+1)을 정의한다. 즉 si는 ai,ai+1,…,an의 최대공약수다. 구하는 수열이 존재할 필요충분조건은 s1이 d를 나누는 것이다. 존재하면 왼쪽부터 차례로 값을 정한다. D0=d로 두고 i=1,2,…,n−1에 대해 다음과 같이 xi를 고른다.
마지막 값은 xn=Dn−1/an이다. n=1이면 고르는 과정 없이 x1=d/a1이다. 이 규칙이 만드는 값은 항상 ∣xi∣≤107을 만족한다.
첫째 줄에 테스트의 개수 t가 주어진다 (1≤t≤105). 이어서 각 테스트가 주어진다.
각 테스트의 첫째 줄에는 두 정수 n과 d가 주어진다 (1≤n≤105, 1≤d≤106). 둘째 줄에는 n개의 정수 ai가 주어진다 (1≤ai≤106). 모든 테스트의 n을 더한 값은 105을 넘지 않는다.
각 테스트마다 답을 출력한다. 구하는 수열이 존재하면 한 줄에 YES를 출력하고, 다음 줄에 x1,x2,…,xn을 공백 하나로 구분해 출력한다. 위에서 정의한 수열만 정답으로 인정한다. 그런 수열이 없으면 그 테스트의 출력으로 NO만 출력한다.