Il est temps pour un autre défi facile auquel tous peuvent participer!
Le théorème multinomial énonce:
L'expression entre parenthèses est le coefficient multinomial, défini comme:
Laisser les termes k i s'étendre sur toutes les partitions entières de n donne le n -ième niveau du m- simplex de Pascal . Votre tâche consiste à calculer ce coefficient.
Tâche
Écrivez un programme ou une fonction qui prend m nombres, n , k 1 , k 2 , ..., k m-1 , et génère ou renvoie le coefficient multinomial correspondant. Votre programme peut éventuellement prendre m comme argument supplémentaire si nécessaire. Notez que k m n'est pas en entrée.
Ces nombres peuvent être entrés dans n'importe quel format souhaité, par exemple regroupés dans des listes ou codés en unaire, ou toute autre chose, tant que le calcul réel du coefficient multinomial est effectué par votre code, et non par le processus de codage.
Le format de sortie est également flexible.
Tout le code doit s'exécuter en moins d'une minute pour n et m jusqu'à 1000.
Ne vous inquiétez pas du débordement d'entier.
Les éléments intégrés conçus pour calculer le coefficient multinomial ne sont pas autorisés.
Des échappatoires standard s'appliquent.
Notation
Voici le code golf: la solution la plus courte en octets gagne.
Cas de test
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}]
, car l'exposant est bien au-delà de ce que les flottants 64 bits peuvent représenter. (Des flottants de 128 bits suffiront probablement, mais je suppose que vous souhaitez utiliser le type de numéro natif de JavaScript?)
1934550571913396675776550070308250
, pouvons-nous produire1.9345505719133966e+33
?