Вызов
Давайте представим N
кортеж целых чисел от 0 до M
включительно и назовем его F
.
Всего (M + 1) ** N
возможно F
s.
Сколько таких F
s удовлетворяет всем следующим неравенствам (индекс основан на единицах)?
F[n] + F[n+1] <= M
за1 <= n < N
F[N] + F[1] <= M
Написать программу или функцию , которая принимает два положительных целых чисел N
и , M
и выводит ответ в любой удобной форме.
Тестовые случаи
(N,M) => Answer
(1,1) => 1
(2,1) => 3
(3,1) => 4
(4,1) => 7
(1,2) => 2
(2,2) => 6
(3,2) => 11
(4,2) => 26
(10,3) => 39175
(10,4) => 286555
(10,5) => 1508401
(25,3) => 303734663372
(25,4) => 43953707972058
(25,5) => 2794276977562073
(100,3) => 8510938110502117856062697655362747468175263710
(100,4) => 3732347514675901732382391725971022481763004479674972370
(100,5) => 60964611448369808046336702581873778457326750953325742021695001
объяснение
M (max value of element) = 1
F[1] + F[1] <= 1; F = [0]
(1,1) => 1
F[1] + F[2] <= 1; F = [0,0], [0,1], [1,0]
(2,1) => 3
F = [0,0,0], [0,0,1], [0,1,0], [1,0,0]
(3,1) => 4
F = [0,0,0,0], [0,0,0,1], [0,0,1,0], [0,1,0,0], [0,1,0,1], [1,0,0,0], [1,0,1,0]
(4,1) => 7
---
M = 2
F[1] + F[1] <= 2; F = [0], [1]
(1,2) => 2
F = [0,0], [0,1], [0,2], [1,0], [1,1], [2,0]
(2,2) => 6
F = [0,0,0], [0,0,1], [0,0,2], [0,1,0], [0,1,1], [0,2,0], [1,0,0], [1,0,1],
[1,1,0], [1,1,1], [2,0,0]
(3,2) => 11
(4,2) => 26 (left as exercise for you)
правила
- Это сложная задача с ограниченными возможностями. Временная сложность вашего кода должна быть полиномиальной
M
иN
(например, вы не можете сгенерировать все(M + 1) ** N
кортежи и затем проверить условие). Пожалуйста, объясните ваш подход в вашем представлении. - Применяются стандартные правила игры в гольф . Самый короткий ответ в байтах побеждает.
code-golf
restricted-complexity
фонтанчик для питья
источник
источник
mat(...,int)
, похоже, не работает дляn=100
случаев. Метод верный (например, использование sympy для суммирования степеней корней характеристического полинома работает), но где-то numpy идет не так, как надо, когда числа увеличиваются (возможно, это**
оператор степени?)Pyth , 27 байт
демонстрация
Ожидается ввод в формате:
Это классическое динамическое программирование, над левым концом заданных значений, правым концом и текущим размером разрыва.
Как это работает, в псевдокоде / Python:
Q
используется дляM
,z
используется дляN
,:
естьfill
,N
естьleft
,T
естьright
,Y
естьgap
.источник
MATL ,
1312 байтПопробуйте онлайн! Это прямой перевод ответа xnor на Python и мой первый ответ на MATL, поэтому он, скорее всего, не оптимален. Например, есть более короткий способ получить верхнюю левую треугольную матрицу, чем
t&lYRP
. Редактировать: И оказывается, что есть, а именно:&>~P
. Спасибо Луису Мендо за -1 байт!источник
Stax , 17 байт
Запустите и отладьте его
Распакованный, размазанный и прокомментированный, это выглядит так.
Запустите этот
источник
R , 72 байта
Попробуйте онлайн!
Подходы порта кснора.
Сбой для более крупных тестовых случаев, поскольку R имеет только 32-битную целочисленную поддержку (они приводятся при
double
достижении максимального значения int), поэтомуgmp
потребуется использование или другой арифметической библиотеки произвольной точности.Как ни странно, в R отсутствует матричный оператор степени, как
^
всегда применяется поэлементно.источник
%^%
в пакете есть должным образом реализованный операторexpm
, который допускает -5 байтов , но, к сожалению, он не доступен на TIO (мне пришлось тестировать локально).function(M,N)sum(diag(expm::`%^%`(outer(0:M,0:M,"+")<=M,N)))