Дано m
от n
шоколада, m,n
положительные, выходного число способов , чтобы сломать планку в mn
1 по 1 штуки , где каждый разрыв происходит на линии сетки.
Порядок важен. Кусочки также различимы, поэтому две части на каждом конце шоколадной плитки 1 на 3 не эквивалентны.
Например, для блока 2 на 2 имеем:
_ _ _ _ _ _ _ _
|_‖_| -> |‗| |_| -> |_| |‗| -> |_| |_|
|_‖_| |_| |_| _ |_| _ _
|_| |_| |_|
_ _ _ _ _ _ _ _
|_‖_| -> |_| |‗| -> |‗| |_| -> |_| |_|
|_‖_| |_| |_| |_| _ _ _
|_| |_| |_|
_ _ _ _ _ _ _ _
|‗|‗| -> |_‖_| -> |_| |_| -> |_| |_|
|_|_| _ _ _ _ _ _
|_|_| |_‖_| |_| |_|
_ _ _ _ _ _ _ _
|‗|‗| -> |_|_| -> |_‖_| -> |_| |_|
|_|_| _ _ _ _ _ _
|_‖_| |_| |_| |_| |_|
Следовательно, есть 4 способа разбить плитку шоколада 2 на 2.
правила
Ввод будет двумя целыми числами через функцию ввода, STDIN, командную строку или подобное. Выведите одно число, количество способов разбить плитку шоколада.
Поскольку числа растут довольно быстро, не беспокойтесь, если выходные данные превысят целочисленные пределы вашего языка - ваше представление будет действительным до тех пор, пока алгоритм теоретически работает для всех возможных входных данных.
Контрольные примеры
Вывод не зависит от порядка m,n
, поэтому контрольные примеры перечислены так, что m <= n
.
1 1 -> 1
1 2 -> 1
1 3 -> 2
1 4 -> 6
1 5 -> 24
1 10 -> 362880
2 2 -> 4
2 3 -> 56
2 4 -> 1712
2 5 -> 92800
2 10 -> 11106033743298560
3 3 -> 9408
3 4 -> 4948992
3 5 -> 6085088256
3 10 -> 76209753666310470268511846400
4 4 -> 63352393728
A261964 - это шоколадные числа, расположенные в треугольнике, так что каждый ряд соответствует сумме m+n
.
источник
options(expressions=...)
и аргумента--max-ppsize=
) приведет к более длинному коду, чем этот.f=
.Python 2, 135 байт
Вот что я придумал. Это действительно медленно, но вот более быстрая версия (нужна repoze.lru ):
Примеры
объяснение
Код определяет функцию,
C
которая принимает массив частей. Алгоритм таков:for i,Q in enumerate(A)
: цикл по массиву частей.for W,H in(Q,Q[::-1])
: рассчитать пути дважды, поворачивая на 90 градусов.for c in range(1,W)
: цикл через возможные позиции для разделения.A[:i]+A[i+1:]+[(c,H),(W-c,H)]
: получить список без разделенной части и с двумя новыми частями.C(…)
: вызвать функцию снова в этом списке.sum(…)
: суммировать результаты для каждого возможного разделения.or 1
Если раскол невозможен, есть только один способ расколоть шоколад.Наконец, код вызывается с массивом, содержащим входные данные.
источник
ES6, 141 байт
На основе формулы, найденной @CameronAavik. Ungolfed:
источник