길이가 N, 각 항의 값이 1 이상 M 이하의 정수인 수열의 개수를 세는 상황을 생각해 보자.
먼저, 모든 항이 같은 수열은 총 M가지이다.
따라서 2개 이상의 서로 다른 값을 포함하는 수열은 MN−M가지가 존재한다. 이 중 최솟값의 위치를 Ai, 최댓값의 위치를 Aj라고 하자. 만약 최댓값 또는 최솟값이 여러 위치에 존재한다면 그 중 가장 번호가 작은 것으로 가정한다.
이때 i<j인 경우와 i>j인 경우가 일대일 대응됨을 확인할 수 있다. ({A1,A2,…,AN}↔{M+1−A1,M+1−A2,…,M+1−AN})
따라서 i<j인 경우는 총 2MN−M가지이다.
Aj−Ai=d인 상황을 생각해 보자. 이 조건을 만족하도록 Ai,Aj의 값을 정하는 경우의 수는 M−d가지이다.
p=i,p=j인 Ap를 정하는 방법의 수는 p에 대해 다음과 같다.
- 1≤p<i : Ai<Ap<Aj, 총 Aj−Ai−1=d−1가지
- i<p<j : Ai≤Ap<Aj, 총 Aj−Ai=d가지
- j<p≤N : Ai≤Ap≤Aj, 총 Aj−Ai+1=d+1가지
따라서 i<j인 수열의 개수는 ∑d=1M(M−d)∑1≤i<j≤N(d−1)i−1dj−i−1(d+1)N−j가지이며, 이는 구해야 하는 식과 일치한다.
따라서 답은 2MN−M이며, O(N) 또는 O(logN)의 시간복잡도로 계산할 수 있다.