BSUIR Open X. Reload. Students final
A. Наклейки BSUIR Open
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
64 мегабайта
ввод
стандартный ввод
вывод
стандартный вывод

Кто-то предложил идею раздать каждому участнику по наклейке с логотипом BSUIR Open. Для этого в университете нашли прямоугольный лист самоклеящейся бумаги размером $$$n \times m$$$. Всего на соревнование приедут $$$k$$$ участников, поэтому необходимо вырезать ровно $$$k$$$ логотипов в форме квадрата одинакового размера. Теперь осталось определить максимальный размер каждой наклейки с логотипом.

К сожалению для этой задачи у организаторов не осталось свободных рук, поэтому вас просят помочь определить максимальный размер логотипа (длину стороны квадрата).

Видимо наклейки будут уже в следующем году...

Входные данные

В первой строке задано три целых числа $$$n$$$, $$$m$$$ и $$$k$$$ — ширина, высота листа бумаги и количество участников соответственно.

$$$$$$ 1 \le n, m \le 10^3 $$$$$$ $$$$$$ 1 \le k \le 10^9 $$$$$$

Выходные данные

В единственной строке выведите единственное вещественное число — максимальный размер логотипа.

Ваш ответ будет засчитан, если относительная или абсолютная погрешность не будет превышать $$$10^{-6}$$$. Формально если $$$a$$$ — ваш ответ, а $$$b$$$ — ответ жюри, то он будет засчитан если $$$\frac{|a - b|}{max(b, 1)} \le 10^{-6}$$$.

Пример
Входные данные
2 2 3
Выходные данные
1.0

B. Два дерева
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
128 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Максим Витальевич решил разобраться в теории графов. Он изучил некоторую теорию касательно связных неориентированных графов, однако здесь у Максима Витальевича возникли трудности.

Среди всех видов связных неориентированных графов, Максим Витальевич подробно разобрался только в деревьях. Напомним, что дерево — это связный граф, не содержащий циклов, состоящий из $$$n$$$ вершин и $$$n - 1$$$ ребер. Другие виды графов вызывают некоторые трудности, так как в них могут быть циклы, либо они могут быть несвязными.

Чтобы разобраться с более сложными видами графов, Максим Витальевич решил их представлять в виде объединения набора деревьев. Для простоты он решил ограничиться только двумя деревьями. Для того, чтобы представить граф из $$$n$$$ вершин в виде объединения двух деревьев, Максим Витальевич раскрасил каждое ребро в один из трех цветов. Далее он построил первое дерево из $$$n$$$ вершин, используя ребра, раскрашенные цветами $$$1$$$ и $$$3$$$, а второе дерево из $$$n$$$ вершин — используя ребра, раскрашенные цветами $$$2$$$ и $$$3$$$. Таким образом, если объединить два дерева, то получится исходный граф, так как каждое ребро принадлежит как минимум одному дереву.

На этом сложности не закончились. Максим Витальевич заметил, что некоторые графы довольно сложно раскрасить так, чтобы в результате получалось два дерева с исходным набором вершин. Поэтому Максим Витальевич обратился к вам за помощью.

Помогите Максиму Витальевичу раскрасить $$$m$$$ ребр графа из $$$n$$$ вершин в три цвета так, чтобы его можно было представить в виде двух деревьев, каждое из которых состоит из $$$n$$$ вершин.

Входные данные

В первой строке задано два целых числа $$$n$$$ и $$$m$$$ — количество вершин и ребер в исходном графе.

В следующих $$$m$$$ строках записано по два целых числа $$$x_i$$$ и $$$y_i$$$ — номера вершин, соединенных $$$i$$$-м ребром.

Гарантируется, что исходный граф связный и в нем не содержится кратных ребер и петель.

$$$$$$ 2 \le n \le 100 $$$$$$ $$$$$$ n - 1 \le m \le 200 $$$$$$ $$$$$$ 1 \le x_i, y_i \le n$$$$$$

Выходные данные

В первой строке выведите «No» (без кавычек), если ответа не существует.

В противном случае в первой строке выведите «Yes» (без кавычек).

Во второй строке выведите $$$m$$$ целых чисел $$$c_1$$$, $$$c_2$$$, ... $$$c_m$$$ через пробел, где $$$c_i$$$ ($$$1 \le c_i \le 3$$$) — цвет $$$i$$$-го ребра.

Если существует несколько вариантов ответа, то выведите любой из них.

Примеры
Входные данные
4 4
1 2
1 3
1 4
2 3
Выходные данные
Yes
3 1 3 2 
Входные данные
5 10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5
Выходные данные
No

C. Сумма дробей
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
64 мегабайта
ввод
стандартный ввод
вывод
стандартный вывод

Как-то раз Максим Витальевич решил разобраться с обыкновенными дробями. После довольно длительного изучения теории, он придумал занимательную задачу. Дано следующее уравнение:

$$$$$$ \frac{1}{a} + \frac{1}{b} = \frac{c}{k} $$$$$$

Необходимо определить для заданного целого числа $$$k$$$ количество троек целых положительных чисел $$$a$$$, $$$b$$$ и $$$c$$$, являющихся решением данного уравнения, таких, что $$$a \le b$$$.

Максим Витальевич справился с решением данной задачи для заданного числа $$$k$$$ и теперь интересуется, а при каком $$$k$$$ ($$$1 \le k \le r$$$) количество решений будет максимальным.

Входные данные

В единственной строке задано единственное целое число $$$r$$$ — правая граница для числа $$$k$$$.

$$$$$$ 1 \le r \le 10^9 $$$$$$

Выходные данные

В единственной строке выведите через пробел два целых числа $$$k$$$ и $$$s$$$ ($$$1 \le k \le r$$$) — значение, при котором достигается наибольшее число решений, и количество решений для числа $$$k$$$.

Если существует несколько решений, то выведите то решение, где $$$k$$$ является наименьшим.

Примеры
Входные данные
3
Выходные данные
3 7
Входные данные
5
Выходные данные
4 10
Примечание

В первом примере для $$$k = 3$$$ существуют следующие решения:

$$$(1, 1, 6)$$$, $$$(2, 2, 3)$$$, $$$(3, 3, 2)$$$, $$$(6, 6, 1)$$$, $$$(1, 3, 4)$$$, $$$(2, 6, 2)$$$, $$$(4, 12, 1)$$$.

D. Бинарное дерево
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
128 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

У Максима Витальевича есть бинарное дерево состоящее из $$$n$$$ вершин. Все вершины пронумерованы числами от $$$1$$$ до $$$n$$$. В каждой вершине дерева записано некоторое целое число, причем все числа различные. Он решил превратить его в бинарное дерево поиска используя два вида операций:

  • swap $$$x$$$ — поменять значения в вершине $$$x$$$ и родительской вершине $$$p$$$ местами.
  • rotate $$$x$$$ — осуществить поворот (либо левый, либо правый) вершины $$$x$$$ и родительской вершины $$$p$$$.

На рисунке выше приведен пример выполнения операции «swap» и операции «rotate». Обратите внимание, что операции нельзя применять к корню дерева, так как у него нет родительской вершины.

Помогите Максиму Витальевичу превратить исходное бинарное дерево в бинарное дерево поиска за минимальное количество операций «swap». Напомним, что бинарное дерево является бинарным деревом поиска тогда и только тогда, когда все значения в левом поддереве строго меньше значения в вершине, а все значения в правом поддереве строго больше.

Входные данные

В первой строке задано целое число $$$n$$$ — количество вершин в бинарном дереве.

В следующих $$$n$$$ строках задано по три целых числа $$$a_i$$$, $$$x_i$$$, $$$y_i$$$ ($$$0 \le x_i, y_i \le n$$$) — значение в $$$i$$$-й вершине, номера левой и правой вершин соответственно. Если $$$x_i = 0$$$, то у $$$i$$$-й вершины нет дочерней левой вершины. Если $$$y_i = 0$$$, то у $$$i$$$-й вершины нет дочерней правой вершины.

Гарантируется, что описание вершин во входных данных соответствует корректному описанию бинарного дерева и что все значения $$$a_i$$$ уникальны.

$$$$$$ 1 \le n \le 5\,000 $$$$$$ $$$$$$ 1 \le a_i \le 10^{9} $$$$$$

Выходные данные

В первой строке выведите число $$$m$$$ — общее число операций.

В следующих $$$m$$$ строках выведите описание операций. Описание $$$i$$$-й операции необходимо вывести в одном из следующих форматов:

  • swap $$$x_i$$$, где $$$x_i$$$ — номер вершины.
  • rotate $$$x_i$$$, где $$$x_i$$$ — номер вершины.

Если существует несколько вариантов ответа, то выведите любой. Общее количество операций не должно превышать $$$300\,000$$$.

Примеры
Входные данные
2
1 2 0
2 0 0
Выходные данные
1
swap 2
Входные данные
3
1 2 3
3 0 0
2 0 0
Выходные данные
3
swap 2
rotate 3
swap 1

E. Спасение котят
ограничение по времени на тест
3 секунды
ограничение по памяти на тест
512 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Максим Витальевич очень любит играть в игры, точнее, в одну конкретную игру. Максим Витальевич проводил так много времени в этой игре, что в последнее время она ему надоела, и он решил сделать перерыв. Если точнее, то Максим Витальевич решил найти другую интересную игру.

После усердного поиска в интернете Максим Витальевич наткнулся на увлекательную игру-головоломку. В данной игре есть несколько уровней. На картинке ниже изображен пример уровня.

Каждый уровень представлен клетчатым полем размера $$$n \times m$$$, где $$$n$$$ – количество строк, а $$$m$$$ – количество столбцов. Каждая клетка этого поля либо свободна, либо занята препятствием, котом, котенком или собакой. На поле всегда находятся ровно один кот и один котенок, а также не более одной собаки. Игрок управляет передвижениями кота. Чтобы пройти уровень, игроку необходимо спасти котенка: за некоторое количество ходов переместить кота в клетку с котенком. За один ход игрок может переместить кота на соседнюю по горизонтали либо вертикали клетку, при этом он не может перемещать кота в клетку с препятствием. Если после хода кот оказался в клетке с котенком, то уровень считается пройденным. Если после хода кот оказался в клетке с собакой, то уровень считается непройденным (и его придется проходить заново).

После каждого хода игрока, при наличии собаки на поле, она осуществляет два хода. За один ход собака сближается с котом на одну клетку либо по вертикали, либо по горизонтали, при этом она не может перемещаться в клетку с препятствием. В качестве расстояния используется Манхэттенское расстояние между котом и собакой. Если собака может сблизиться и по горизонтали, и по вертикали, то она всегда сблизится по горизонтали (переместится либо влево, либо вправо). Если собака не может сблизиться, то она пропускает ход. Обратите внимание, что собака не может отдаляться от кота. Если собака после хода оказалась в клетке с котом, то уровень считается непройденным. Собака может перемещаться в клетку с котенком, при этом, если игрок переместится в клетку с котенком и собакой, то уровень также считается непройденным.

Максим Витальевич застрял на одном из уровней. Помогите Максиму Витальевичу пройти уровень, либо скажите, что данный уровень пройти нельзя.

Входные данные

В первой строке задано два целых числа $$$n$$$ и $$$m$$$ — количество строк и столбцов у поля соответсвенно.

В следующих $$$n$$$ строках содержатся по $$$m$$$ символов — описание игрового поля сверху вниз, слева направо. Каждый символ означает:

  • cимвол «.» — свободная клетка;
  • cимвол «#» — препятствие;
  • cимвол «C» — кот;
  • cимвол «K» — котенок;
  • cимвол «@» — собака.

$$$$$$ 1 \le n, m \le 60 $$$$$$

Выходные данные

Если уровень нельзя пройти, то в единственной строке выведите «No» (без кавычек).

В противном случае в первой строке выведите «Yes» (без кавычек). Во второй строке выведите ходы для кота. Каждый ход представлен одним символом:

  • cимвол «L» — переместиться на одну клетку влево;
  • cимвол «R» — переместиться на одну клетку вправо;
  • cимвол «U» — переместиться на одну клетку вверх;
  • cимвол «D» — переместиться на одну клетку вниз.

Количество ходов не должно превышать $$$100\,000$$$. Если существует несколько решений, то выведите любое, не обязательно кратчайшее.

Примеры
Входные данные
4 6
..C...
##....
.#...K
..@...
Выходные данные
Yes
LLRRRRRDD
Входные данные
1 6
K.@..C
Выходные данные
No

G. Borrow checker
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Максим Витальевич решил изучить новый язык программирования. Один его знакомый порекомендовал изучить язык Rust, так как он самый перспективный. Да, язык действительно воодушевляет, но заставляет столкнуться с суровой реальностью — великим и могучим borrow checker.

Сказать, что Максим Витальевич был в некоторой растерянности, это ничего не сказать. Чтобы выйти из данной ситуации и разобраться с borrow checker, Максим Витальевич решил упростить язык.

Новый язык поддерживает только заранее определенный набор функций. Всего в языке доступно $$$n$$$ функций, описание каждой имеет следующий синтаксис:

<char> := "a" | "b" | ... | "z"
<name> := <char> | <char> <name>
<nameOrRefName> := <name> | "&" <name>
<argument> := <nameOrRefName>
<arguments> := <argument> | <argument> ", " <arguments>
<functionName> := <nameOrRefName>
<functionArguments> := "" | <arguments>
<function> := "fn " <functionName> "(" <functionArguments> ")"

Таким образом, <function> является описанием функции. Можно заметить, что имя функции может быть как «name», так и «&name». В первом случае, функция возвращает значение, во втором случае — ссылку. Примеры корректных функций:

fn input()        // Функция input, возвращает значение и не содержит аргументов.
fn sum(a, b) // Функция sum, возвращает значение и принимает два аргумента по значению.
fn add(&a, &b) // Функция add, возвращает значение и принимает аргументы по ссылке.
fn &ref(a) // Функция ref, возвращает ссылку и принимает аргумент по значению.
fn assign(a, &b) // Функция assign, возвращает значение и принимает первый аргумент
// по значению, а второй по ссылке.

Приведем также некорректные примеры (такие примеры не могут встречаться во входных данных):

&fn funcd()      // Неверный порядок символов.
fn funcb(a, b&) // Неверный порядок символов.
fn funcc(&&a) // Нельзя получить ссылку на ссылку.
fn &&funca() // Нельзя вернуть ссылку на ссылку.
fn fn() // Используется fn в качестве имени.
fn funce(fn) // Используется fn в качестве имени.
fn funcf(a, a) // Одинаковые имена аргументов.
fn funcg(a, &a) // Одинаковые имена аргументов.

Чтобы реализовать некоторую программу, в языке доступна конструкция «<declare>» — объявление новой переменной (или ссылки). Можно описать синтаксис следующим образом:

<callArguments> := <expression> | <expression> ", " <callArguments>
<functionCallArguments> := "" | <callArguments>
<functionCall> := <name> "(" <functionCallArguments> ")"
<expression> := <nameOrRefName> | <functionCall>
<declare> := <name> " := " <expression>

Приведем корректные примеры использования конструкции:

a := input()      // Определяем переменную со значением результата input().
b := input()
c := a // Приcваиваем новой переменной старое значение.
d := add(&b, &c) // Вызываем функцию с передачей аргументов по ссылке.
e := add(ref(b), ref(c))
f := &e

Приведем некорректные примеры использования конструкции (такие примеры не могут встречаться во входных данных):

a := &input()  // Нельзя получить ссылку на результат функции.
fn := a // Нельзя использовать fn в качестве имени.
&b := c // Нельзя объявлять имя-ссылку.

Максим Витальевич считает, что такой синтаксис довольно простой, поэтому синтаксических ошибок при использовании языка он допустить не может.

Однако Максим Витальевич может допустить следующие ошибки:

  • Использовать ранее не объявленную с помощью «:=» переменную.
  • Использовать несуществующую функцию.
  • Вызывать функцию с неверным числом аргументов (число аргументов должно совпадать с определением).
  • В аргумент функции принимающий значение передавать ссылку (либо наоборот).
  • Использовать в выражении ранее перемещенное значение переменной (либо ссылку на такую переменную).

Последний пункт рассмотрим поподробнее. В языке Максима Витальевича предусмотрен собственный механизм borrow checker. Суть заключается в том, что все переменные, которые используются по значению, перемещаются и перестают быть доступными. Рассмотрим следующий пример:

a := input()    // a является значением.
b := sum(a, a) // Ошибка!

В этом случае переменная «a» передается по значению 2 раза, однако после первого же использования она перестает быть доступна, таким образом возникает ошибка. В то же время:

a := input()      // a является значением.
b := sum(&a, &a) // Корректно, если sum принимает ссылки. Переменная a
// остается доступной, так как не была использована по значению.

После объявления переменной с тем же именем (:=), старая переменная (если она является значением) считается перемещенной и перестает быть доступной начиная со следующей строки.

Для ссылок действуют следующие правила:

  • Нельзя получать ссылку для перемещенной переменной.
  • Нельзя получать ссылку для переменной-ссылки.
  • Нельзя использовать ссылку на перемещенную переменную.
  • Нельзя одновременно передавать переменную-значение и ссылку на эту переменную в той же строке.

Рассмотрим следующие примеры:

a := input()
b := a
c := &a // Ошибка, переменная a была перемещена.

a := input()
b := &a
c := move(a) // Аналогично c := a. В любом случае переменная a перемещается.
d := b // Ошибка, переменная b является ссылкой на значение a, которое было перемещено.

a := input()
b := &a
c := call(a, b) // Ошибка. Переменная a была перемещена, поэтому ссылку использовать нельзя.

a := input()
b := &a
a := a // Старое значение переменной a перемещено.
c := clone(b) // Ошибка, переменная b ссылается на старую переменную a, которая
// была перемещена в предыдущей строке.

Так как Максим Витальевич придумал язык и хочет его использовать, он просит вас реализовать программу, которая будет проверять код Максима Витальевича на наличие ошибок.

Входные данные

В первой строке задано число $$$n$$$ — количетсво функций.

В следующих $$$n$$$ строках заданы описания функций в соответсвии с описанным синтаксисом. Гарантируется, что все имена функций уникальны, и все имена аргументов у каждой функции так же уникальны.

В следующей строке задано число $$$m$$$ — количество строк в коде Максима Витальевича.

В следующих $$$m$$$ строках заданы конструкции объявления новой переменной в соответсвии с описанием синтаксиса.

Гарантируется, что суммарная длина строк не превышает $$$100\,000$$$. Во входных данных не содержится лишних пробелов, а также не может быть пробелов меньше, чем описано в синтаксисе языка.

$$$$$$ 1 \le n \le 20 $$$$$$ $$$$$$ 1 \le m \le 100 $$$$$$

Выходные данные

В единственной строке выведите «Valid», если программа является корректной.

В противном случае выведите «Error in line N» (без кавычек), где N — номер первой строки с ошибкой в коде Максима Витальевича.

Нумерация строк начинается с $$$1$$$.

Примеры
Входные данные
3
fn input()
fn clone(&a)
fn sum(a, b)
5
a := input()
b := input()
br := &b
s := sum(a, b)
bc := clone(br)
Выходные данные
Error in line 5
Входные данные
2
fn input()
fn clone(&a)
3
a := input()
a := &a
b := clone(a)
Выходные данные
Error in line 3
Входные данные
2
fn &input()
fn sum(&a, &b)
3
a := input()
b := sum(a, a)
c := sum(a, &b)
Выходные данные
Valid
Примечание

В первом тестовом примере в пятой строке используется ссылка «br» на перемещенное в четвертой строке значение.

Во втором тестовом примере в третей строке используется значение переменной «a», однако она уже была перемещена в предыдущей строке.

H. День рождения
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
64 мегабайта
ввод
стандартный ввод
вывод
стандартный вывод

Максима Витальевича пригласили на день рождения. Он выбрал, по его мнению, отличный подарок — торт в виде правильного выпуклого $$$n$$$-угольника.

Праздник в полном разгаре, Максим Витальевич уже поздравил именинника и получил от него ответственное задание — необходимо разрезать торт на куски, необязательно равного размера. Главное условие, чтобы куски представляли из себя треугольники.

Максим Витальевич задался вопросом, а за какое минимальное количество разрезаний можно разделить торт на треугольники. Разрешается разрезать торт только по диагоналям (прямым, проходящим через пару вершин $$$n$$$-угольника).

Входные данные

В единственной строке задано целое число $$$n$$$ — количество вершин в многоугольнике.

$$$$$$ 4 \le n \le 100 $$$$$$

Выходные данные

Выведите единственное число — минимальное количество разрезаний, необходимое, чтобы разделить торт на треугольные куски.

Примеры
Входные данные
5
Выходные данные
2
Входные данные
8
Выходные данные
4

I. Дерево палиндромов
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Вам дано дерево состоящее из $$$n$$$ вершин. В каждой вершине записан некоторый символ $$$c_i$$$. Вам необходимо удалить некоторое количество вершин так, чтобы оставшееся множество вершин было связным и при этом нельзя было найти палиндромного пути длиной более $$$k$$$. Простой путь называется палиндромным, если при выписывании символов, записанных в вершинах в прямом и обратном порядке, получается одна и та же строка.

Входные данные

В первой строке задано два целых числа $$$n$$$ и $$$k$$$ — количество вершин в дереве и максимальная длина палиндромного пути.

Во второй строке задана строка $$$s$$$ состоящая только из строчных букв латинского алфавита длины $$$n$$$, где $$$i$$$-й символ $$$c_i$$$ соответсвует символу записанному в $$$i$$$-й вершине.

В следующих $$$(n - 1)$$$ строках записано по два целых числа $$$x_i$$$ и $$$y_i$$$ ($$$x_i \ne y_i$$$, $$$1 \le x_i, y_i \le n$$$) — номера вершин соединенных ребром.

$$$$$$ 1 \le k \le n \le 2\,000 $$$$$$

Выходные данные

В первой строке выведите число $$$m$$$ — количество оставшихся после удаления вершин.

Во второй строке выведите $$$m$$$ целых чисел $$$b_i$$$ — номера оставшихся вершин.

Если существует несколько вариантов ответа, то необходимо вывести минимальный ответ, который не является префиксом другого ответа.

Ответ $$$a$$$ меньше $$$b$$$ тогда и только тогда, когда найдется такое $$$p$$$, что $$$a_p \lt b_p$$$ и $$$a_j = b_j$$$ для $$$1 \le j \lt p$$$.

Ответ $$$a$$$ является префиксом $$$b$$$ тогда и только тогда, когда $$$|a| \lt |b|$$$ и $$$a_j = b_j$$$ для $$$1 \le j \le |a|$$$, где $$$|a|$$$ – длина массива $$$a$$$.

Примеры
Входные данные
3 2
aba
1 2
1 3
Выходные данные
3
1 2 3
Входные данные
3 2
aba
1 2
2 3
Выходные данные
2
1 2
Примечание

Во втором примере подходят несколько ответов: $$$(1, 2)$$$, $$$(2, 1)$$$, $$$(2, 3)$$$, $$$(3, 2)$$$, $$$(1)$$$, $$$(2)$$$, $$$(3)$$$. Ответы $$$(1)$$$, $$$(2)$$$, $$$(3)$$$ являются префиксами ответов $$$(1, 2)$$$, $$$(2, 1)$$$ и $$$(3, 2)$$$ соответсвенно. Среди оставшихся подходящих ответов минимальным является $$$(1, 2)$$$.

J. Межпространственный путешественник
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Максим Витальевич захотел отправиться в путешествие. Наверное, ему стало скучно. В любом случае для своего нового путешествия Максим Витальевич решил воспользоваться кораблем для межпространственных путешествий, с помощью которого можно отправиться путешествовать в $$$n$$$-мерном пространстве.

Спустя некоторое время своего путешествия Максим Витальевич попадает в довольно шаткое положение. В прямом смысле его корабль начинает сильно шатать из стороны в сторону. Максим Витальевич сразу понял, что он попал в квантовую турбулентность.

Квантовую турбулентность можно описать следующим образом: турбулентность в измерении $$$i$$$ действует для координат $$$x_i \ge 1$$$. Если корабль находится в квантовой турбулентности для $$$i$$$-го измерения, то он становится неуправляемым в данном измерении. Вместо этого корабль перемещается из координаты $$$x_i$$$ в координату $$$x_i + 1$$$ с вероятностью $$$p$$$ и в координату $$$x_i - 1$$$ с вероятностью $$$q = 1 - p$$$. Если корабль попадает в координату $$$x_i \lt 1$$$, он снова становится управляемым и перестает случайно перемещаться в $$$i$$$-м измерении.

Вам необходимо определить вероятность $$$ans$$$, с которой Максим Витальевич сможет полностью восстановить управление по всем $$$n$$$ измерениям, если изначально он находится в координате $$$(a_1, a_2, ..., a_n)$$$.

Входные данные

В первой строке задано число $$$n$$$ — количество измерений.

Во второй строке задано $$$n$$$ целых чисел $$$a_1$$$, $$$a_2$$$, ..., $$$a_n$$$ — начальные координаты корабля Максима Витальевича.

В следующих $$$n$$$ строках задано по два целых числа $$$s_i$$$, $$$t_i$$$ — значение вероятности $$$p_i$$$, представленное в виде дроби $$$\frac{s_i}{t_i}$$$.

$$$$$$ 1 \le n \le 1\,000 $$$$$$ $$$$$$ 1 \le a_i \le 1\,000 $$$$$$ $$$$$$ 0 \le s_i \le 10^9 $$$$$$ $$$$$$ 1 \le t_i \le 10^9 $$$$$$

Выходные данные

Гарантируется, что ответ $$$ans$$$ можно представить в виде несократимой дроби $$$\frac{s}{t}$$$.

Выведите в единственной строке вероятность того, что Максим Витальевич сможет восстановить управление, представленное в виде $$$s \cdot t^{-1}\mod 10^9+7$$$.

Пример
Входные данные
3
1 2 3
4 6
8 10
5 6
Выходные данные
714250005