각 사람 p가 마지막으로 작성한 메시지의 번호를
Lp=max({i∣Ai=p}∪{0})
라고 하자. 작성자 조건은 Cp≥Lp와 같다.
편의를 위해 B0=N, BM+1=0으로 둔다. 정확히 k번 메시지까지 읽은 사람의 수를 Dk라고 하면
Dk=Bk−Bk+1(0≤k≤M)
이다. 입력에서 B가 비증가 수열임이 보장되므로 모든 Dk는 음이 아닌 정수이다.
Ek를 Lp≤k인 사람의 수라고 하자. Cp=k가 되려면 반드시 Lp≤k여야 한다.
k=0,1,⋯,M 순서로 Cp=k인 사람을 정한다. k보다 작은 값을 이미 받은 사람은 정확히
N−Bk
명이다. 이들은 모두 Lp≤k를 만족한다. 따라서 아직 값을 받지 않았고 Cp=k가 될 수 있는 사람은
Ek−(N−Bk)
명이다.
이 중 정확히 Dk명을 고르면 된다. 따라서 답은
k=0∏M(DkEk−(N−Bk))
이다. 문제에서 유효한 수열이 하나 이상 존재한다고 보장하므로 모든 단계의 선택은 가능하다. 구현에서는 조합의 위쪽 값이 Dk보다 작거나 음수인지 확인해도 된다.
각 사람의 Lp를 구한 뒤, Lp의 빈도에 대한 누적합으로 모든 Ek를 구할 수 있다. 팩토리얼과 역팩토리얼을 전처리하면 각 조합을 O(1)에 계산할 수 있다.
시간 복잡도는 O(N+M)이고, 메모리 복잡도는 O(N+M)이다.