만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

환상적인 압축

시간 제한3초메모리 제한512 MB

요약
1부터 n까지의 순열에서 연속한 k개 원소의 합이 주어질 때, 이 합을 만드는 모든 순열을 사전순으로 구합니다.
난이도

보통10점 중 7점

유형
백트래킹, 수학, 배열
정답자
아직 제출이 없습니다

문제

Franek에게는 맡은 일이 하나 있었다. 수열 (1,2,…,n)(1, 2, \dots, n)의 순열 PP를 외우는 것이다. 하지만 이 일은 너무 지루했다. 그래서 그는 작은 정수 kk를 정하고, PP에서 길이가 kk인 연속된 구간들의 합만 외우기로 했다. 이제 Franek은 수열 S=(S1,S2,…,Sn−k+1)S = (S_1, S_2, \dots, S_{n-k+1})을 가지고 있다. 여기서

S1=P1+P2+⋯+PkS_1 = P_1 + P_2 + \dots + P_k

S2=P2+P3+⋯+Pk+1S_2 = P_2 + P_3 + \dots + P_{k+1}

…\dots

Sn−k+1=Pn−k+1+Pn−k+2+⋯+PnS_{n-k+1} = P_{n-k+1} + P_{n-k+2} + \dots + P_n

이다.

이 방법은 잘 통하지 않았다. 서로 다른 순열이 같은 압축 수열이 되는 경우가 있었다. 또한 Franek은 압축 수열을 정확히 기억했는지 확신할 수 없고, 원래 순열은 영영 잃어버렸을지도 모른다. 주어진 압축 수열 SS에 대응하는 모든 순열 PP를 찾아라.

입력

첫 줄에 테스트 케이스의 수 zz (1≤z≤10001 \le z \le 1000)가 주어진다. 각 테스트 케이스는 다음 형식으로 주어진다.

테스트 케이스의 첫 줄에는 순열의 길이 nn과 Franek이 정한 작은 정수 kk가 주어진다 (2≤n≤25 0002 \le n \le 25\,000; 2≤k≤min⁡(n,6)2 \le k \le \min(n, 6)). 둘째 줄에는 압축 수열 SS의 원소 n−k+1n - k + 1개가 주어진다 (1≤Si≤1 000 0001 \le S_i \le 1\,000\,000).

모든 테스트 케이스의 순열 길이 합은 250 000250\,000을 넘지 않는다.

출력

각 테스트 케이스마다 주어진 수열 SS에 대응하는 순열의 개수 cc를 먼저 출력한다. 이어서 cc개의 순열을 사전순으로, 한 줄에 하나씩 nn개의 정수를 공백으로 구분해 출력한다.

주어진 테스트에서 cc는 10001000을 넘지 않는다고 가정한다.

예제1

  1. 예제 1

    입력
    2
    5 3
    8 10 12
    5 3
    10 10 10
    
    예상 출력
    2
    1 2 5 3 4
    2 1 5 4 3
    0