В данной задаче рассматриваются булевы функции от четырех переменных A, B, С, D. Переменные A, B, C и D являются логическими и могут принимать значения 0 или 1. Будем задавать функцию с помощью следующей грамматики:
<выражение> ::= <переменная> | (<выражение>) <оператор> (<выражение>)
<переменная> ::= 'A' | 'B' | 'C' | 'D' | 'a' | 'b' | 'c' | 'd'
<оператор> ::= '&' | '|'
Здесь заглавными буквами A, B, C, D обозначаются переменные, а строчными — их отрицания. Например, если A = 1, то символу 'A' соответствует значение 1, а символу 'a' — значение 0. Символ '&' здесь соответствует операции логического И, символ '|' — операции логического ИЛИ.
Вам дано выражение s, задающее функцию f, в котором некоторые операторы и переменные пропущены. Так же вам известны значения функции f(A, B, C, D) для некоторых n различных наборов значений переменных. Посчитайте количество способов восстановить пропущенные в выражении элементы так, чтобы получившееся выражение соответствовало известной информации о функии f в заданных наборах переменных. Так как величина результата может быть большой, выведите её остаток от деления на 109 + 7.
Выходные данные
В единственной строке выведите ответ на задачу.
Примечание
В первом примере двумя подходящими выражением являются 'C' и 'd'.
Во втором примере выражения выглядят так: '(A)&(a)', '(A)&(b)', '(A)&(C)', '(A)&(D)'.
Примеры
| № | Входные данные | Выходные данные |
|
1
|
? 2 1 0 1 0 1 0 1 1 0 1
|
2
|
|
2
|
(A)?(?) 1 1 1 0 0 0
|
4
|
|
3
|
((?)&(?))|((?)&(?)) 0
|
4096
|
|
4
|
b 1 1 0 1 1 1
|
1
|