만드는 중입니다

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

DFS 트리 개수 세기

면접 대비

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

요약
노드가 n개이고 모든 잎이 깊이 K에 있는 트리에서 나올 수 있는 DFS 반환값의 종류 수 f_K(n)을 구하고, 주어진 A_i마다 f_K(A_i)를 모두 곱한 값을 998244353으로 나눈 나머지로 출력합니다.
난이도

보통10점 중 5점

유형
동적 계획법, 누적 합, 조합론
정답자
아직 제출이 없습니다

문제

깊이 우선 탐색(DFS)이라는 트리 순회 알고리즘을 공부하고 있다. 노드가 nn개이고 깊이가 KK인 루트 트리를 생각하자. 노드는 1부터 nn까지, 깊이는 1부터 KK까지 번호가 붙어 있다. 루트(깊이 1의 노드)는 노드 1이다. 모든 잎은 같은 깊이, 즉 깊이 KK에 있다. 노드 ii는 자식 노드들의 배열 cic_i를 가지며, ii가 잎이면 이 배열은 비어 있을 수 있다. 알고리즘의 의사 코드는 다음과 같다.

DFS(u, depth):
  let res be an empty array
  append depth to res

  for each v in c[u]:
    let D be an array initialized with DFS(v, depth + 1)
    for each x in D:
      append x to res

return res

그림의 트리에서 DFS(1, 1)의 반환값은 왼쪽 트리가 [1,2,3,3,3][1, 2, 3, 3, 3], 오른쪽 트리가 [1,2,3,2,3][1, 2, 3, 2, 3]이다.

fK(n)f_K(n)을 노드가 nn개이고 모든 잎이 깊이 KK에 있는 모든 트리에 걸쳐, DFS(1, 1)이 가질 수 있는 서로 다른 반환값의 개수로 정의한다. 정수 MM개 A1,A2,…,AMA_1, A_2, \dots, A_M이 주어질 때, fK(A1)×fK(A2)×⋯×fK(AM)f_K(A_1) \times f_K(A_2) \times \cdots \times f_K(A_M)의 값을 998 244 353998\,244\,353으로 나눈 나머지를 구하라.

입력

첫 줄에 두 정수 KK와 MM이 주어진다(1≤K,M≤100 0001 \le K, M \le 100\,000). 둘째 줄에는 MM개의 정수 A1,A2,…,AMA_1, A_2, \dots, A_M이 주어진다(K≤Ai≤200 000K \le A_i \le 200\,000).

출력

fK(A1)×fK(A2)×⋯×fK(AM)f_K(A_1) \times f_K(A_2) \times \cdots \times f_K(A_M)의 값을 998 244 353998\,244\,353으로 나눈 나머지를 출력한다.

예제2

  1. 예제 1

    입력
    3 2
    5 6
    
    예상 출력
    6
    
  2. 예제 2

    입력
    100000 1
    200000
    
    예상 출력
    269130693