задача
Даны два целых числа d
и n
, найти количество способов выразить n
как сумму d
квадратов. То есть n == r_1 ^2 + r_2 ^2 + ... + r_d ^2
такое, что r_m
является целым числом для всех целых чисел 1 ≤ m ≤ d
. Обратите внимание, что обмен двух разных значений (например, r_1
и r_2
) считается отличным от исходного решения.
Например, число 45 может быть записано как сумма 2 квадратов 8 различными способами:
45
== (-6)^2 + (-3)^2
== (-6)^2 + 3^2
== (-3)^2 + (-6)^2
== (-3)^2 + 6^2
== 3^2 + (-6)^2
== 3^2 + 6^2
== 6^2 + (-3)^2
== 6^2 + 3^2
правила
- Встроенные решения разрешены, но не конкурируют (например, Mathematica )
- Стандартные лазейки также запрещены.
- Входы могут быть обратными.
Пример ввода / вывода
In: d, n
In: 1, 0
Out: 1
In: 1, 2
Out: 0
In: 2, 2
Out: 4
In: 2, 45
Out: 8
In: 3, 17
Out: 48
In: 4, 1000
Out: 3744
In: 5, 404
Out: 71440
In: 11, 20
Out: 7217144
In: 22, 333
Out: 1357996551483704981475000
Это код-гольф , поэтому выигрывают заявки, использующие наименьшее количество байтов!
code-golf
number
number-theory
combinatorics
Юнг Хван Мин
источник
источник
1, 0
теста, есть1
способ выразить0
в виде суммы1
квадрата:0 == 0^2
.Ответы:
Python 3 , 125 байт
Попробуйте онлайн!
Завершает последний тестовый случай за 0,078 с. Наивная сложность O ( d n 2 ).
источник
Mathematica, 8 байтов, не конкурирует
источник
Желе , 9 байт
Попробуйте онлайн!
Берет
n
иd
в таком порядке.источник
MATL , 13 байт
Входы есть
n
, тогдаd
. В некоторых тестовых случаях не хватает памяти.Попробуйте онлайн!
объяснение
Рассмотрим входы
17
,3
.источник
Haskell , 43 байта
Просто ваша основная рекурсия. Определяет двоичную инфиксную функцию
#
.Попробуйте онлайн!объяснение
Если
d == 0
иn /= 0
, мы во втором случае, и условиеd>0
заставляет список быть пустым. Сумма пустого списка равна 0, что является правильным выводом в этом случае.источник
Пари / ГП , 31 байт
Попробуйте онлайн!
источник
05AB1E , 10 байтов
Принимает аргументы как n, а затем d. Есть проблемы с решением больших тестовых случаев.
Попробуйте онлайн!
объяснение
источник
Желе , 23 байта
Попробуйте онлайн!
Порт моего Python-решения . Завершает последний тестовый сценарий за 2.977 с.
источник
Mathematica, 38 байт
Чистая функция принимает входные данные в порядке
n
,d
.Range[-#,#]^2
дает набор всех возможных релевантных квадратов с положительными квадратами, перечисленными дважды, чтобы сделать счет правильным;Tuples[...,#2]
создаетd
кортежи таких квадратов;Tr/@
суммирует каждыйd
набор; иCount[...,#]
считает, сколько результатов равноn
.Первые несколько тестовых случаев быстро заканчиваются, но я полагаю, что для выполнения тестового примера потребуется около полугода
1000,4
. ЗаменаRange[-#,#]
на (более длинное, но) более разумноеRange[-Floor@Sqrt@#,Floor@Sqrt@#]
ускоряет это вычисление примерно до 13 секунд.источник
Mathematica,
5351 байтисточник
Python 2, 138
Очень неэффективное решение с моим любимым eval. Почему нет?
Попробуйте онлайн
Он генерирует и оценивает код следующим образом:
Поэтому для некоторого большого d он будет работать очень долго и занимать много памяти, имея сложность O (n ^ d)
источник
к , 23 байта
Попробуйте онлайн! Это простой перебор.
источник
Pyth - 16 байт
Попытайся
Это ужасно неэффективно
источник