Задача 8. A+B

Автор:Михаил Путилин   Ограничение времени:1 сек
Входной файл:Стандартный вход   Ограничение памяти:512 Мб
Выходной файл:Стандартный выход  
Максимальный балл:100  

Условие

Рассмотрим a, b и c — целые неотрицательные числа, записанные в десятичной системе счисления. Пусть они имеют одинаковую длину n, при этом запись может начинаться с нуля. Числа записаны одно под другим, цифры расположены в три строки и n столбцов. Рассмотрим пример такой записи:


  01211
  12099
  23300
  

Требуется переставить столбцы в этой записи таким образом, чтобы выполнялось равенство a + b = c. В полученной записи ведущие нули уже запрещены. Сколько существует различных способов это сделать?

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

Поскольку ответ может быть довольно большим, требуется посчитать для него остаток по модулю 109 + 7.

Формат входных данных

Во входных данных записаны целые неотрицательные числа a, b и c по одному в строке. Каждое число состоит из n десятичных цифр и может начинаться с нуля.

Формат выходных данных

Выведите количество подходящих перестановок столбцов по модулю 109 + 7.

Ограничения

2 ≤ n ≤ 2 ⋅ 105

Система оценки

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

Подзадача Баллы Доп. ограничения Необходимые подзадачи Информация о проверке
172 ≤ n ≤ 6первая ошибка
2142 ≤ n ≤ 181первая ошибка
3152 ≤ n ≤ 200, нет цифры нольпервая ошибка
452 ≤ n ≤ 2001–3первая ошибка
5172 ≤ n ≤ 750, нет цифры ноль3первая ошибка
652 ≤ n ≤ 7501–5первая ошибка
7202 ≤ n ≤ 2 ⋅ 105, нет цифры ноль3, 5первая ошибка
8172 ≤ n ≤ 2 ⋅ 1051–7первая ошибка

Пояснения к примерам

В первом примере подходят все перестановки столбцов.

Во втором примере единственная подходящая перестановка — 10 + 20 = 30. 01 + 02 = 03 не считается из-за наличия ведущих нулей.

В третьем примере возможны варианты 10121 + 21909 = 32030 и 12101 + 20919 = 33020, причём каждый из них может быть получен двумя разными перестановками.

Примеры тестов

Стандартный вход Стандартный выход
1
123
123
246
6
2
01
02
03
1
3
01211
12099
23300
4
4
121
214
999
0

Разбор

Подзадача 1

Первая подзадача решается перебором n! перестановок.

Подзадача 2

Каждый столбец можно охарактеризовать тремя параметрами (обозначим цифры в нём за ai, bi, ci):

  1. Есть ли в нём цифра ноль (это влияет на то, может ли он быть первым).
  2. Требуется ли ему перенос из столбца справа, в зависимости от того, верно (ai + bimod 10 = ci или (ai + bi + 1mod 10 = ci. Если ни одно из этих равенств не выполнено, то ответ 0. Обозначим этот параметр needCarryi ∈ {0,1}.
  3. Создаёт ли этот столбец перенос через разряд. Это так, когда ai + bi + needCarryi ≥ 10. Обозначим этот столбец makeCarryi ∈ {0,1}.

Будем выбирать перестановку столбцов слева направо. Первым может идти столбец без нулей и не создающий переноса. Если после столбца i идёт столбец j, то needCarryi = makeCarryj. Для последнего столбца needCarryi = 0. Получается граф, в котором нужно найти число гамильтоновых путей. Это можно сделать при помощи динамического программирования за O(2n n2), решив, таким образом, вторую подзадачу.

Подзадачи 3 и 4

В полученном графе есть четыре вида вершин в зависимости от значений needCarryi и makeCarryi. Обозначим эти виды следующим образом:

На рисунке показано, какие рёбра есть в графе, а также какие вершины могут быть начальными и конечными.

Посчитать гамильтоновы пути в таком графе можно динамикой за O(n4): dx[A][B][C][D] — число путей, которые заканчиваются в вершине вида x и проходят через соответствующее число вершин каждого вида. Это решает подзадачу 3.

Чтобы решить подзадачу 4, нужно учесть, что нельзя начинать со столбца с нулём. Это влияет только на базу динамики: в dA[1][0][0][0] и dB[0][1][0][0] нужно записать количество соответствующих столбцов, в которых нет нулей.

Подзадачи 5 и 6

На любом пути в таком графе, который начинается в A или B, количество вершин вида B не более чем на один превосходит количество вершин вида C. Это позволяет сократить число состояний в динамике до O(n3), решив, таким образом, подзадачи 5 и 6.

Подзадача 7

Обозначим за A, B, C, D количество вершин каждого вида. Любой интересующий нас путь выглядит следующим образом:

_B_C_B_C_B_C… B_C_

При этом вершины A расположены в промежутках перед B, а также в последнем. Вершины D расположены в промежутках после B. Кроме того, если B ≠ C, то ответ 0.

Если B = C = 0 и D > 0, то ответ 0. Если B = C = 0 и D = 0, то ответ A!.

Если B = C > 0, то ответом будет произведение следующих чисел:

  1. Количество способов расставить вершины B по местам: B!
  2. Количество способов расставить вершины C по местам: B!
  3. Количество способов расставить A вершин в B + 1 промежуток с учётом порядка: (A + B)!B!
  4. Количество способов расставить D вершин в B промежутков с учётом порядка: (D + B − 1)!(B − 1)!

Ответ равен (A + B)!(D + B − 1)!B. Это решение за O(n) проходит подзадачу 7.

Подзадача 8

Осталось учесть, что среди вершин вида A и B может быть сколько-то вершин, с которых нельзя начинать (столбцы с нулями). Обозначим эти количества за A0 и B0.

Как и в прошлой подзадаче, если B = C = 0 и D > 0, то ответ 0. Если B = C = 0 и D = 0, то ответ (A − 1)! ⋅ (A − A0).

Далее B = C > 0. Сначала отдельно посчитаем:

Ответ равен ansA ⋅ A − A0A + ansB ⋅ B − B0B.


0.138s 0.013s 15