예선 라운드 F번 문제

양의 정수 a_i와 d가 주어질 때 합 a_i x_i = d를 만족하는 0이 아닌 x_i가 존재하는지 판정하고, 각 |D_i|를 최소로 만드는 규칙이 정한 유일한 수열을 출력한다.

어려움8정수론그리디수학구현아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

땅요정 폴이 땅요정 수학 컵 예선 라운드에 나갔다. F번 문제는 다음과 같다.

양의 정수 nna1,a2,,ana_1, a_2, \ldots, a_n과 양의 정수 dd가 주어진다. 다음 식을 만족하면서 어느 것도 00이 아니고 xi107|x_i| \le 10^7인 정수 x1,x2,,xnx_1, x_2, \ldots, x_n을 구하라.

a1x1+a2x2++anxn=d.a_1 x_1 + a_2 x_2 + \cdots + a_n x_n = d.

땅요정은 큰 수를 싫어하므로 모든 aia_idd10610^6 이하이고, 어떤 xix_i00이 될 수 없다.

식을 만족하는 수열은 여러 개일 수 있어서 정답으로 인정하는 수열은 하나로 정해져 있다. sn+1=0s_{n+1} = 0으로 두고 i=n,n1,,1i = n, n-1, \ldots, 1 순서로 si=gcd(ai,si+1)s_i = \gcd(a_i, s_{i+1})을 정의한다. 즉 sis_iai,ai+1,,ana_i, a_{i+1}, \ldots, a_n의 최대공약수다. 구하는 수열이 존재할 필요충분조건은 s1s_1dd를 나누는 것이다. 존재하면 왼쪽부터 차례로 값을 정한다. D0=dD_0 = d로 두고 i=1,2,,n1i = 1, 2, \ldots, n-1에 대해 다음과 같이 xix_i를 고른다.

  1. xix_i00이 아니고, Di=Di1aixiD_i = D_{i-1} - a_i x_i00이 아닌 si+1s_{i+1}의 배수다.
  2. 그런 xix_i 중에서 Di|D_i|가 가장 작아지는 것을 고른다.
  3. Di|D_i|가 같은 후보가 둘이면 더 작은 xix_i를 고른다.

마지막 값은 xn=Dn1/anx_n = D_{n-1} / a_n이다. n=1n = 1이면 고르는 과정 없이 x1=d/a1x_1 = d / a_1이다. 이 규칙이 만드는 값은 항상 xi107|x_i| \le 10^7을 만족한다.

입력

첫째 줄에 테스트의 개수 tt가 주어진다 (1t1051 \le t \le 10^5). 이어서 각 테스트가 주어진다.

각 테스트의 첫째 줄에는 두 정수 nndd가 주어진다 (1n1051 \le n \le 10^5, 1d1061 \le d \le 10^6). 둘째 줄에는 nn개의 정수 aia_i가 주어진다 (1ai1061 \le a_i \le 10^6). 모든 테스트의 nn을 더한 값은 10510^5을 넘지 않는다.

출력

각 테스트마다 답을 출력한다. 구하는 수열이 존재하면 한 줄에 YES를 출력하고, 다음 줄에 x1,x2,,xnx_1, x_2, \ldots, x_n을 공백 하나로 구분해 출력한다. 위에서 정의한 수열만 정답으로 인정한다. 그런 수열이 없으면 그 테스트의 출력으로 NO만 출력한다.