NPM998244353 (Hard)

0부터 MM까지의 각 자릿수 합 상한에 대해, P로 나누어떨어지는 길이 N의 숫자열 개수를 998244353으로 나눈 나머지로 구한다.

어려움9조합론동적 계획법정수론행렬아직 제출이 없습니다시간 제한5초메모리 제한512 MB

문제

길이가 NN인 정수 중에서 PP로 나누어떨어지고 각 자리 숫자의 합이 MM 이하인 것이 몇 개인지 세려고 한다. 맨 앞자리가 0이어도 되므로, 0부터 9까지의 숫자를 NN개 나열한 것은 모두 길이가 NN인 정수로 본다. 예를 들어 N=2N = 2일 때 00과 03도 각각 하나로 센다.

M=0,1,,MMM = 0, 1, \dots, MM 각각에 대해 조건을 만족하는 수의 개수를 998244353으로 나눈 나머지를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 NN, PP, MMMM이 공백으로 구분되어 주어진다. (1N1091 \le N \le 10^9, 1P161 \le P \le 16, 1MM150001 \le MM \le 15000)

출력

첫째 줄에 정수 MM+1MM+1개를 공백 한 칸으로 구분해 출력한다. 앞에서부터 ii번째 정수(i=0,1,,MMi = 0, 1, \dots, MM)는 M=iM = i일 때의 정답, 즉 길이가 NN인 정수 중에서 PP로 나누어떨어지고 각 자리 숫자의 합이 ii 이하인 것의 개수를 998244353으로 나눈 나머지이다.

힌트

N=2N = 2, P=3P = 3인 경우 세는 수는 다음과 같다.

  • M=0,1,2M = 0, 1, 2: 00
  • M=3M = 3: 00, 03, 12, 21, 30

N=2N = 2, P=4P = 4인 경우는 다음과 같다.

  • M=0,1M = 0, 1: 00
  • M=2M = 2: 00, 20
  • M=3M = 3: 00, 12, 20
  • M=4M = 4: 00, 04, 12, 20, 40