Время для еще одной простой задачи, в которой могут участвовать все!
Полиномиальная теорема гласит:
Выражение в скобках - это множитель, определяемый как:
Разрешение членам k i охватывать все целочисленные разбиения n дает n-й уровень m -симплекса Паскаля . Ваша задача - вычислить этот коэффициент.
задача
Напишите программу или функцию, которая принимает m чисел, n , k 1 , k 2 , ..., k m-1 и выводит или возвращает соответствующий коэффициент многочлена. Ваша программа может дополнительно принять m в качестве дополнительного аргумента, если это необходимо. Обратите внимание, что k m не на входе.
Эти числа могут быть введены в любом понравившемся формате, например, сгруппированы в списки или закодированы в унарном виде, или как угодно, если фактическое вычисление коэффициента многочлена выполняется вашим кодом, а не процессом кодирования.
Формат вывода также гибкий.
Весь код должен выполняться менее чем за одну минуту для n и m до 1000.
Не беспокойтесь о целочисленном переполнении.
Встроенные модули, предназначенные для вычисления коэффициента многочлена, не допускаются.
Применяются стандартные лазейки.
счет
Это код гольф: выигрывает самое короткое решение в байтах.
Контрольные примеры
Input: 3, [2, 0]
Output: 3
Input: 3, [1, 1]
Output: 6
Input: 11, [1, 4, 4]
Output: 34650
Input: 4, [1,2]
Output: 12
Input: 15, [5,4,3,2]
Output: 37837800
Input: 95, [65,4,4]
Output: 1934550571913396675776550070308250
Input: 32, [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
Output: 4015057936610313875842560000000
Input: 15, [3,3,3,3]
Output: 168168000
Input: 1000, [10,10,10,10,10,10,10,10,10,10,100,100,100,100,100,100,100,100]
Output: 1892260836114766064839886173072628322819837473493540916521650371620708316292211493005889278395285403318471457333959691477413845818795311980925098433545057962732816261282589926581281484274178579110373517415585990780259179555579119249444675675971136703240347768185200859583936041679096016595989605569764359198616300820217344233610087468418992008471158382363562679752612394898708988062100932765563185864346460326847538659268068471585720069159997090290904151003744735224635733011050421493330583941651019570222984959183118891461330718594645532241449810403071583062752945668937388999711726969103987467123014208575736645381474142475995771446030088717454857668814925642941036383273459178373839445456712918381796599882439216894107889251444932486362309407245949950539480089149687317762667940531452670088934094510294534762190299611806466111882595667632800995865129329156425174586491525505695534290243513946995156554997365435062121633281021210807821617604582625046557789259061566742237246102255343862644466345335421894369143319723958653232683916869615649006682399919540931573841920000000000000
Input: 33, [17]
Output: 1166803110
Input: 55, [28]
Output: 3824345300380220
источник
1934550571913396675776550070308250
, можем ли мы выводить1.9345505719133966e+33
?[1000 {999 ones}]
, потому что показатель степени намного превышает то, что может представлять 64-битные числа с плавающей запятой. (Возможно, будет достаточно 128-разрядных чисел с плавающей запятой, но я предполагаю, что вы хотите использовать собственный тип чисел в JavaScript?)Ответы:
Желе ,
76 байтСмотри, ма, нет Юникода! Эта программа принимает в качестве входных данных один список с n в первом индексе.
Попробуйте онлайн! или проверьте все тестовые случаи одновременно .
Как это работает
источник
CJam, 11 байт
Ввод в виде единого списка с
n
первым:Это ручки входы до
n
иm
1000 довольно много мгновенно.Проверьте это здесь.
объяснение
источник
MATL , 21
15байтДавайте использовать функцию log-gamma . Это позволяет избежать внутреннего переполнения, работая с логарифмами факториалов, а не с самими факториалами.
Это работает в текущей версии (9.2.2) языка / компилятора, которая является более ранней, чем эта проблема.
Входные данные: сначала число, затем числовой вектор. Результат создается как a
double
, который ограничивает максимальную производительность где-то рядом2^52
.пример
объяснение
источник
PowerShell,
9174 байтаWoo! Мой сотый ответ на PPCG!
Уф. Не собираюсь выигрывать кратчайший код, это точно. Тем не менее, использует несколько хитрых трюков с диапазонами. И это, вероятно, полный бред для всех, кто не знаком с PowerShell.
объяснение
Сначала мы берем ввод с
param($n,$k)
и ожидаем,$k
что он будет массивом, например.\compute-the-multinomial-coefficient.ps1 11 @(1,4,4)
.Начнем с числителя (все слева от
/
). Это просто диапазон1..$n
, который был-join
отредактирован вместе с*
и затем оцененiex
для вычисления факториала (то есть1*2*3*...*$n
).Затем мы зацикливаемся
$k|%{...}
и на каждой итерации вычитаем текущее значение ($_
из$n
которого мы больше не заботимся), чтобы сформулировать его$k_m
позже. Кроме того, мы генерируем диапазон1..$k_i
каждой итерации, который остается на конвейере. Эти объекты конвейера объединяются в массив со вторым выражением, range1..$n
(который находится$k_m
в этой точке). Все это, в конечном итоге, обрабатывается-join
вместе с*
оценкойiex
, аналогично числителю (это работает потомуx! * y! = 1*2*3*...*x * 1*2*3*...*y
, что нас не интересует индивидуальный порядок).Наконец,
/
случается, числитель делится на знаменатель и выводится.Правильно обрабатывает выходные данные для больших чисел, поскольку мы не приводим явным образом какие-либо переменные как какие-либо конкретные типы данных, поэтому PowerShell будет автоматически преобразовывать типы данных на лету по мере необходимости. Для больших чисел выходные данные через научную запись лучше сохраняют значимые цифры при повторном приведении типов данных. Например,
.\compute-the-multinomial-coefficient.ps1 55 @(28)
будет выводить3.82434530038022E+15
. Я предполагаю, что все будет в порядке, учитывая, что «формат вывода такой же гибкий» задан в вызове и в комментариях квинтопии «Если конечный результат может вписаться в искомо поддерживаемые целочисленные типы, то результат должен быть точным. нет никаких ограничений на то, что может быть выведено ".альтернативно
В зависимости от решения о форматировании вывода, следующие в 92 байта
Что же , как и выше, просто использует явный вывод форматирования с
.ToString('G17')
для достижения требуемого количества цифр. Для55 @(28)
этого будет выходной3824345300380220.5
Edit1 - Сэкономил 17 байт, избавившись от него
$d
и просто вычислив его напрямую, а также избавившись от вычисления$k_m
, связав его во время цикла$k
Edit2 - Добавлена альтернативная версия с явным форматированием
источник
APL (Dyalog Extended) , 9 байт
Попробуйте онлайн!
Используя идею из моего APL ответа на еще одну проблему, которая включает в себя многочлены .
Неявная функция, левый аргумент которой является списком k, а правый аргумент - n. Тестовые случаи проверяют, соответствует ли это решению Адама, когда левый и правый аргументы перевернуты.
Как это работает
источник
Mathematica, 26 байтов
Пример:
источник
Питон 3,
9391Спасибо Деннису и FryAmTheEggman .
n
как целое число,k
как итеративный.Ungolfed:
источник
95, [65, 4, 4]
. Обратите внимание, что вход не содержит k_m . 2. Вы, кажется, не используетеfrom functools import*
вообще.reduce
. 2.import math;f=math.factorial
сохраняет байт. 3. Python 2 позволит вам избавиться от второго/
входа//
.f
самостоятельно сохраняет несколько байт :f=lambda x:0**x or x*f(x-1)
.APL (Dyalog Unicode) , 16 байтов SBCS
Всецело основано на математическом мастерстве моего коллеги Маршалла .
Анонимная инфиксная функция. Принимает k в качестве правого аргумента и n в качестве левого аргумента.
Попробуйте онлайн!
{
...}
анонимная лямбда;⍺
левый аргумент ( n ) и⍵
правый аргумент ( k )0,⍵
ставить ноль до k¯1↓
выбросить последний элемент из этого+\
накопленная сумма этого⍺-
вычесть это из п⍵!
( k ) что×/
продукт этогоисточник
PARI / GP, 43 байта
Довольно просто; Помимо форматирования, версия без заглядывания вполне может быть идентична.
источник
Matlab 48 байтов
Вам нужно установить ,
format
чтобыlong
заранее , чтобы получить более высокую точность. Тогда это довольно просто:источник
Pyth, 10 байт
Попробуйте онлайн: демонстрация
Объяснение:
источник
J, 16 байт
использование
Для больших значений используется суффикс
x
для обозначения целых чисел с расширенной точностью.объяснение
источник
05AB1E , 8 байтов
Попробуйте онлайн! Объяснение:
Кажется, я не могу найти лучшие способы выполнить шаг 2 или шаг 4.
источник
APL (Dyalog Unicode) , 17 байт
Попробуйте онлайн!
Инфиксная молчаливая функция (спасибо @ Adám за 2 байта, которые она сохраняет.)
APL (Dyalog Unicode) , 19 байт
Попробуйте онлайн!
Инфикс Dfn.
Обе функции выше вычисляют данную формулу.
источник
Haskell ,
5958 байтПопробуйте онлайн!
Спасибо BMO за сохранение 1 байта!
источник
Clojure, 70 байт
Создает анонимную функцию, принимающую все аргументы как один список, с
n
первым.30 символов «впустую», просто определяя чертову факториальную функцию. Ну что ж.
источник
Perl 6 ,
5250 байтПопробуй это
Проверьте это (результат - Rational с знаменателем 1)
Expanded:
источник