Zeit für eine weitere leichte Herausforderung, an der alle teilnehmen können!
Der Ausdruck in Klammern ist der Multinomialkoeffizient, definiert als:
Wenn man zulässt, dass die Terme k i über alle ganzzahligen Partitionen von n reichen, erhält man das n- te Niveau von Pascals m- Simplex. Ihre Aufgabe ist es, diesen Koeffizienten zu berechnen.
Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die m Zahlen, n , k 1 , k 2 , ..., k m-1 annimmt und den entsprechenden Multinomialkoeffizienten ausgibt oder zurückgibt. Ihr Programm kann gegebenenfalls m als zusätzliches Argument verwenden. Beachten Sie, dass k m nicht in der Eingabe ist.
Diese Zahlen können in einem beliebigen Format eingegeben werden, zum Beispiel in Listen gruppiert oder in Unary oder irgendetwas anderem codiert, solange die eigentliche Berechnung des Multinomialkoeffizienten von Ihrem Code durchgeführt wird und nicht der Codierungsprozess.
Das Ausgabeformat ist ähnlich flexibel.
Der gesamte Code sollte in weniger als einer Minute für n und m bis 1000 ausgeführt werden.
Sorgen Sie sich nicht um einen Ganzzahlüberlauf.
Integrierte Funktionen zur Berechnung des Multinomialkoeffizienten sind nicht zulässig.
Es gelten Standardlücken.
Wertung
Das ist Codegolf: Kürzeste Lösung in Bytes gewinnt.
Testfälle
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
[1000 {999 ones}]
, da der Exponent weit über dem Wert liegt, den 64-Bit-Floats darstellen können. (128-Bit-Floats werden wahrscheinlich ausreichen, aber ich gehe davon aus, dass Sie den nativen Zahlentyp von JavaScript verwenden möchten?)
1934550571913396675776550070308250
können wir ausgeben1.9345505719133966e+33
?