Étant donné un entier N , comptez combien de façons il peut être exprimé comme un produit de M entiers> 1.
L'entrée est simplement N et M , et la sortie est le nombre total de groupes entiers distincts . Cela signifie que vous pouvez utiliser un entier plus d'une fois, mais chaque groupe doit être distinct ( 3 x 2 x 2
ne compterait pas s'il 2 x 2 x 3
est présent).
Contraintes
1 < N <2 31
1 < M <30
Exemples
L'entrée 30 2
donne la sortie 3
, car elle peut être exprimée de 3 façons:
2 x 15
3 x 10
5 x 6
L'entrée 16 3
donne la sortie 1
, car il n'y a qu'un seul groupe distinct:
2 x 2 x 4
L'entrée 2310 4
donne la sortie 10
:
5 x 6 x 7 x 11
3 x 7 x 10 x 11
3 x 5 x 11 x 14
3 x 5 x 7 x 22
2 x 7 x 11 x 15
2 x 5 x 11 x 21
2 x 5 x 7 x 33
2 x 3 x 11 x 35
2 x 3 x 7 x 55
2 x 3 x 5 x 77
L'entrée 15 4
donne la sortie 0
, car cela ne peut pas être fait.
Règles
Les failles de golf de code standard s'appliquent, ainsi que les définitions standard d'entrée / sortie. Les réponses peuvent être une fonction ou un programme complet. Les fonctions intégrées de factorisation et / ou de partitionnement ne sont pas autorisées, mais d'autres conviennent. Le code est compté en octets.
Réponses:
Pyth -
24232221 octetsPas une solution compliquée. Jouera plus au golf. Prend juste un produit cartésien de listes et de filtres. Même stratégie que @optimizer (je suppose qu'en raison de son commentaire, n'a pas réellement déchiffré ce CJam) Merci à @FryAmTheEggman pour 2 octets et astuce avec M.
Définit une fonction
g
avec argsG
etH
A travaillé sur tous les arguments de test sauf le dernier, était trop lent sur celui-ci, mais aucune limite de temps n'est donnée.
la source
M
qui définit la fonctiong
de 2 arguments,G
etH
. Voilà ce que je reçois pour cela:Ml{msdfqu*GHT1G^r2GH
. Toujours agréable de voir un autre utilisateur Pyth :)72 3
, qui renvoie 5, mais il y a en fait 6 réponses,(2, 2, 18), (2, 3, 12), (2, 4, 9), (2, 6, 6), (3, 3, 8)
Python 3, 59
Nous comptons les diviseurs potentiels
i
. Avec l'argument supplémentairei
comme le plus petit diviseur autorisé, la relation récursive de base estPour chacun
i
, nous choisissons de l'inclure (possible en tant que répétition), auquel cas nous divisons le produit requisN
pari
et décrémentonsM
. Si nous ne le faisons pas, nous augmentonsi
de 1, mais seulement sii<N
, puisqu'il ne sert à rien de vérifier les diviseurs supérieurs àN
.Lorsque le diviseur minimum
i
dépasseN
, il n'y a plus de diviseurs potentiels. Nous vérifions donc si nous avons réussi en voyant siM==0 and N==1
, ou, de manière équivalente,M+1==N==1
ouM+1==N<2
, depuis quandM+1==N
, la valeur mutuelle est garantie d'être un entier positif (merci à FryAmTheEggman pour cette optimisation).Ce code provoquera un débordement de pile d'
N
environ 1000 sur la plupart des systèmes, mais vous pouvez l'exécuter en Stackless Python pour éviter cela. De plus, il est extrêmement lent en raison de sa ramification exponentielle récursive.la source
-~M==N<2
M
etN
. Merci!Rubis, 67
Effectivement raisonnablement efficace pour une définition récursive. Pour chaque paire
[d,q]
de diviseurs de n,d
étant la plus petite, nous additionnons le résultat def[q,m-1]
. La partie délicate est que dans les appels internes, nous limitons les facteurs à ceux supérieurs ou égaux à d afin de ne pas finir par un double comptage.la source
CJam, 48 octets
Cela peut être beaucoup plus court mais j'ai ajouté certaines vérifications pour le faire fonctionner pour un nombre décent de
M
sur le compilateur en ligne.Essayez-le en ligne ici
la source
2 1
. Sortie attendue: 1. Sortie réelle: 0.T-SQL
456373Je suis sûr que cela se cassera lorsque les entrées seront même proches d'être grandes.
Merci à @MickyT d'avoir aidé à sauver beaucoup de caractères avec CONCAT et SELECT au lieu de plusieurs SET.
la source
SET @C+=',# A'+@
etSET @D+='*A'+@+'.A'SET @E+=' AND A'+(@-1)+'.A<=A'+@+'.A'
SET @C+=@D+'=@N'+@E+' SELECT @'
. Le@N
est à l'intérieur des guillemets, ce qui le rend hors de la portée lors de l'exécution@C
. Je pense aussi que vousCONCAT
pour créer vos chaînes. Ensuite, vous pouvez supprimer leCONVERT
s. EssayezSELECT @+=1,@C+=CONCAT(...),@D+=CONCAT(...),@E+=CONCAT(...)
dans votreWHILE
boucle. Devrait vous faire économiser un nombre raisonnable