만드는 중입니다

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

프라이멀 배열

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

요약
1부터 N+1까지의 값 중 S를 뺀 나머지로 만든 힙 모양 배열 가운데, S를 N+1번 위치에 넣고 위로 올리는 과정에서 정확히 K번 교환되는 경우의 수를 구합니다.
난이도

어려움10점 중 8점

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

문제

길이가 처음에 NN인 배열 AA가 주어진다. 인덱스는 11부터 NN까지이고, 원소는 11 이상 N+1N + 1 이하의 서로 다른 정수이다. 이 배열은 primal이다. 즉, i>1i > 1인 모든 인덱스에 대해 AiA_i는 항상 A⌊i/2⌋A_{\lfloor i/2 \rfloor}보다 작다.

SS는 11 이상 N+1N + 1 이하의 값 중에서 A1,A2,…,ANA_1, A_2, \dots, A_N에 나타나지 않는 값이다. 배열 끝에 새 원소 AN+1A_{N+1}로 SS를 추가한 뒤 아래 알고리즘을 실행한다.

algorithm(A):
  x = N + 1
  counter = 0
  while x > 1:
    if A[x] > A[floor(x / 2)]:
      swap(A[x], A[floor(x / 2)]);
      counter = counter + 1
    x = floor(x / 2)
  return counter

SS를 추가하고 algorithm(A)를 실행했을 때 KK를 반환하는 초기 배열 AA의 개수를 구한다. 초기 배열 AA는 SS를 제외한 11 이상 N+1N + 1 이하의 서로 다른 정수를 원소로 가지며, primal이어야 한다. 답이 매우 클 수 있으므로 998 244 353998\,244\,353으로 나눈 나머지를 구한다.

입력

한 줄에 정수 NN, SS, KK가 주어진다 (1≤N≤100 0001 \le N \le 100\,000; 1≤S≤N+11 \le S \le N + 1; 0≤K≤N0 \le K \le N).

출력

위의 조건을 만족하는 초기 배열 AA의 개수를 998 244 353998\,244\,353으로 나눈 나머지로 출력한다.

예제3

  1. 예제 1

    입력
    5 3 1
    
    예상 출력
    4
    
  2. 예제 2

    입력
    2 2 1
    
    예상 출력
    0
    
  3. 예제 3

    입력
    7 6 2
    
    예상 출력
    40