https://www.acmicpc.net/problem/30521
30521번: Mike Sees The Storm (Large)
N=2, K=2일 때 Mike가 얻을 수 있는 수열의 목록은 [−1,−2,−1,0], [−1,0,−1,0], [−1,0,1,0], [1,2,1,0], [1,0,1,0], [1,0,−1,0] 총 6가지로, 최댓값의 K제곱을 합하면 7이다.
www.acmicpc.net
카탈란 수의 응용입니다.
먼저 주어진 문제를 격자 속의 최단 경로 문제로 환원합니다.
칠판에 적힌 숫자를 a에서 a−1 로 바꾸는 연산을 오른쪽으로 한 칸 이동하는 것으로,
a에서 a+1로 바꾸는 연산을 위로 한 칸 이동하는 것으로 간주할 수 있습니다.
이렇게 문제를 환원하였을 때 최댓값이 0인 경로는 주대각선의 아래로만 지나가는 경로임을 확인할 수 있습니다.
또한 그러한 경로의 개수는 카탈란 수와 같은데, 이는 대각선을 지나는 경로를 대칭시키는 방법으로 구할 수 있습니다.
결과적으로 최댓값이 0 인 경로의 개수는
\binom{2N}{N} - \binom{2N}{N-1}
입니다.
이제 최댓값이 1 인 경로의 개수를 구합니다.
카탈란 수를 구할 때와 마찬가지로 대각선을 설정한 뒤, 해당 대각선을 지나는 경로를 대칭시킵니다.
그러면 최댓값이 1 인 경로의 개수는
\binom{2N}{N} - \binom{2N}{N-2} - \left \{ \binom{2N}{N} - \binom{2N}{N-1} \right \}
= \binom{2N}{N-1} - \binom{2N}{N-2}
와 같이 나오게 됩니다.
이런 식으로 최댓값이 i 인 경로의 개수가 다음과 같이 나옵니다.
\binom{2N}{N - i} - \binom{2N}{N - i - 1}
이로부터 정답은
N^{k} + \sum_{i=0}^{N-1}i^{k} \times \left \{ \binom{2N}{N - i} - \binom{2N}{N - i - 1} \right \}
인데, 식을 변형하여
\sum_{i=0}^{N-1} \binom{2N}{i} \left \{ (N-i)^{K} - (N-i-1)^{K} \right \}
으로도 구할 수 있습니다.
이론상 최선의 시간복잡도는 O(N \log K) 이지만, O(N \log P + N \log K) 로도 시간 안에 충분히 들어옵니다.
제 코드는 다음과 같습니다.
#include <stdio.h>
#define mod 1000000007ull
typedef unsigned long long ull;
ull power_modular (ull X, ull Y) {
ull result = 1;
while(Y) {
if (Y % 2) {
result = result * X % mod;
}
X = X * X % mod;
Y /= 2;
}
return result;
}
int main() {
ull N, K;
scanf("%llu %llu", &N, &K);
ull array[1000001] = {};
for (int i = 0; i <= N; i++) array[i] = power_modular(i, K);
ull answer = 0;
ull binom = 1;
for (int i = 0; i < N; i++) {
answer = (answer + binom * (array[N - i] - array[N - 1 - i] + mod)) % mod;
binom = (binom * (2 * N - i) % mod) * power_modular(i + 1, mod - 2) % mod;
}
printf("%llu", answer);
return 0;
}
(C11, 184ms, 8808KB, 제출번호 69530647)
O(N\log P \log K) 로도 풀릴까요?
'분할 정복을 이용한 거듭제곱 > 정수 거듭제곱' 카테고리의 다른 글
백준 30354번: Sum of Product of Binomial Coefficients (1) | 2023.11.09 |
---|---|
백준 30169번: Primes and Multiplication (1) | 2023.09.30 |
백준 27743번: 어려운 하노이 탑 (1) | 2023.09.30 |
백준 28294번: 프랙탈 (0) | 2023.09.02 |
백준 27875번: 파이파이 (0) | 2023.09.01 |