Stack

Time limit: 4s Memory limit: 1024MB Input: Output:

Se dă un șir, ss, de mărime NN cu elemente din mulțimea {0,1,2,,M1}\{0, 1, 2, \ldots, M - 1\}. Definim funcția de compresie a unul șir astfel:

function compress(s)
	stk ← []
	for i ← 0 ... len(s) − 1 do
		if s[i] = ultimul element din stk then
			șterge ultimul element din stk
		else
			stk ← stk + s[i]
		end if
	end for
	return len(stk)
end function

Cerință

Vom nota cu s[ij]s[i\dots j] secvența contiguă a lui ss obținută prin eliminarea prefixului s0,s1,si1s_0, s_1, \dots s_{i-1} și a sufixului sj+1,sj+2,sN1s_{j+1}, s_{j+2}, \dots s_{N-1}.

Să se calculeze

0ij<Ncompress(s[ij])\sum_{0 \le i \le j < N} \operatorname{compress}(s[i \dots j])

De vreme ce acest număr poate deveni foarte mare, se cere restul împărțirii sale la 2642^{64}.

Detalii de implementare

Va trebui să implementezi funcția

std::uint64_t sum_compressed_lengths(std::vector<int> s, int M);

care:

  • primește ca parametri șirul ss și MM, cu semnificația din enunț;
  • returnează suma cerută modulo 2642^{64}.

Comisia va apela funcția o singură dată per test.

Restricții și precizări

  • 1MN5 000 0001 \leq M \leq N \leq 5 \ 000 \ 000
  • 0si<M0 \leq s_i < M
# Punctaj Restricții
1 2 M=1M = 1
2 3 1N2 0001 \leq N \leq 2 \ 000
3 11 M=2,1N500 000M = 2, 1 \leq N \leq 500 \ 000
4 13 1NM5 000 0001 \leq N \cdot M \leq 5 \ 000 \ 000
5 22 1N500 0001 \leq N \leq 500 \ 000
6 49 Fără restricții suplimentare.

Exemplu

input

10 5
2 2 3 3 4 4 1 1 4 3

output

64

Log in or sign up to be able to send submissions!