프라이멀 배열
시간 제한1초메모리 제한2048 MB
1부터 N+1까지의 값 중 S를 뺀 나머지로 만든 힙 모양 배열 가운데, S를 N+1번 위치에 넣고 위로 올리는 과정에서 정확히 K번 교환되는 경우의 수를 구합니다.
문제
길이가 처음에 인 배열 가 주어진다. 인덱스는 부터 까지이고, 원소는 이상 이하의 서로 다른 정수이다. 이 배열은 primal이다. 즉, 인 모든 인덱스에 대해 는 항상 보다 작다.
는 이상 이하의 값 중에서 에 나타나지 않는 값이다. 배열 끝에 새 원소 로 를 추가한 뒤 아래 알고리즘을 실행한다.
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
를 추가하고 algorithm(A)를 실행했을 때 를 반환하는 초기 배열 의 개수를 구한다. 초기 배열 는 를 제외한 이상 이하의 서로 다른 정수를 원소로 가지며, primal이어야 한다. 답이 매우 클 수 있으므로 으로 나눈 나머지를 구한다.
입력
한 줄에 정수 , , 가 주어진다 (; ; ).
출력
위의 조건을 만족하는 초기 배열 의 개수를 으로 나눈 나머지로 출력한다.