eolymp
bolt
Спробуйте наш новий інтерфейс для відправки розв'язків
Задачі

Гарвард

Гарвард

\includegraphics{https://static.e-olymp.com/content/d0/d0258f2cc3a4da1a66073ace138adede1dd185d4.jpg} Термін "Гарвардська архітектура" можна застосовувати до комп'ютера з фізично розділеною пам'яттю для інструкцій та даних. Термін походить від імені комп'ютера Harvard Mark I, створеного у 1944 році. У ньому для інструкцій використовувалась паперова стрічка, а для даних --- реле. Деякі сучасні мікроконтролери використовують "Гарвардську архітектуру", але не паперові стрічки та реле! Дані лежать у банках, кожен з яких містить однакове число комірок. Кожна інструкція звернення до даних має байт-зміщенння \textbf{f} у межах банку та біт \textbf{a}, який використовується для визначення номера банку. Якщо \textbf{a} дорівнює \textbf{0}, то звернення відбувається до банку під номером \textbf{0}. Якщо \textbf{a} дорівнює \textbf{1}, то номер банку зберігається у спеціальному регістрі вибору банку (РВБ). Наприклад, нехай у нас є \textbf{4} банки з \textbf{8} комірками кажен. Звернутись до комірки під номером \textbf{5} можна двома способами: однією інструкцією з \textbf{a} = \textbf{0} та \textbf{f} = \textbf{5} або двома інструкціями, встановивши значення РВБ рівним \textbf{0} і потім використавши інструкцію з \textbf{a} = \textbf{1} та \textbf{f} = \textbf{5}. Очевидно, що перший спосіб швидший, бо не потрібно присвоювати значення РВБ. Тепер припустимо, що потрібно звернутись до комірки \textbf{20} у тій же пам'яті. Тепер можна застосувати лише один спосіб: виконати інструкцію, встановивши значення РВБ \textbf{2} (якщо у ньому вже не зберігається потрібне значення), а потім інструкцію з \textbf{a} = \textbf{1} та \textbf{f} = \textbf{4}. Програма являє собою послідовність операцій. Кожна операція це: \begin{itemize} \item звернення до змінної, записується як \textbf{V_i}, де \textbf{i} --- додатне ціле число; \item повторення, записується як \textbf{R_n} < \textbf{program }> \textbf{E}, де \textbf{n} --- додатне ціле число, а < \textbf{program} > --- довільна програма, ця операція еквівалентна виконанню програми \textbf{n} разів. \end{itemize} Задача полягає у визначенні мінімального часу виконання програми. А саме, знаючи кількість та розмір банків, а також маючи програму, потрібно визначити мінімальну кількість інструкцій \textbf{1 }(звернення до комірок та, можливо, встановлення значення РВБ) необхідних для виконання програми. Для цього вам потрібно асоціювати змінні з комірками пам'яті і серед усіх відображень визначити те, яке мінімізує число інструкцій. Потрібно вивести саме це число. Зверніть увагу, що значення РВБ до першого присвоєння не визначено. \InputFile Вхідні дані містять один тест, який складається з двох рядків. У першому \textbf{b} та \textbf{s }--- кількість банків та кількість змінних, які можна зберігати у банку. Другй рядок містить непорожню програму з не більш ніж \textbf{1000} елементів (кожен з \textbf{R_n}, \textbf{V_i} та \textbf{E} вважається за один елемент). Можно припускати, що: \begin{itemize} \item у повторенні \textbf{R_n}, \textbf{n} задовольняє умові \textbf{1} ≤ \textbf{n} ≤ \textbf{10^6}; \item тіло повторення \textbf{R_n} < \textbf{program }> \textbf{E} < \textbf{program }> не порожнє; \item при звертанні до змінної \textbf{V_i}, \textbf{i} задовольняє умову \textbf{1} ≤ \textbf{i} ≤ \textbf{min}(\textbf{b}*\textbf{s}, \textbf{13}); \item загальне число звернень до змінних у програмі не перевищує \textbf{10^12}. \end{itemize} \OutputFile Виведіть одне число --- мінімальне число інструкцій, необхідних для виконання програми.
Ліміт часу 10 секунд
Ліміт використання пам'яті 256 MiB
Вхідні дані #1
1 2
V1 V2 V1 V1 V2
Вихідні дані #1
5
Джерело ACM-ICPC World Finals 2013