Zählen Sie bei einer Ganzzahl N , auf wie viele Arten sie als Produkt von M Ganzzahlen> 1 ausgedrückt werden kann .
Die Eingabe ist einfach N und M , und die Ausgabe ist die Gesamtzahl verschiedener ganzzahliger Gruppen. Das heißt, Sie können eine ganze Zahl mehr als einmal verwenden, aber jede Gruppe muss unterschiedlich sein ( 3 x 2 x 2
würde nicht zählen, wenn 2 x 2 x 3
vorhanden).
Einschränkungen
1 < N <2 31
1 < M <30
Beispiele
Input 30 2
liefert Output 3
, da es auf drei Arten ausgedrückt werden kann:
2 x 15
3 x 10
5 x 6
Eingabe 16 3
gibt Ausgabe 1
, da es nur eine eindeutige Gruppe gibt:
2 x 2 x 4
Input 2310 4
gibt Output 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
Eingabe 15 4
gibt Ausgabe 0
, da dies nicht möglich ist.
Regeln
Es gelten Standard-Code-Golf-Regelungslücken sowie Standarddefinitionen für die Eingabe / Ausgabe. Die Antworten können eine Funktion oder ein vollständiges Programm sein. Eingebaute Funktionen zur Faktorisierung und / oder Partitionierung sind nicht zulässig, andere sind jedoch in Ordnung. Code wird in Bytes gezählt.
Antworten:
Pyth -
24232221 BytesKeine komplizierte Lösung. Wird mehr golfen. Nimmt einfach kartesisches Produkt von Listen und Filtern. Gleiche Strategie wie @optimizer (ich vermute wegen seines Kommentars, habe diesen CJam nicht wirklich entschlüsselt) Danke an @FryAmTheEggman für 2 Bytes und Trick mit M.
Definiert eine Funktion
g
mit argsG
undH
Hat an allen Testargumenten mit Ausnahme des letzten gearbeitet, war an diesem zu langsam, aber es ist kein Zeitlimit angegeben.
quelle
M
die die Funktion definiertg
von zwei Argumenten,G
undH
. Dies ist , was ich für diese:Ml{msdfqu*GHT1G^r2GH
. Immer schön, einen anderen Pyth-Benutzer zu sehen :)72 3
, die 5 zurückgibt, aber es gibt tatsächlich 6 Antworten,(2, 2, 18), (2, 3, 12), (2, 4, 9), (2, 6, 6), (3, 3, 8)
Python 3, 59
Wir zählen potenzielle Teiler auf
i
. Mit dem zusätzlichen Argumenti
als niedrigstem zulässigen Divisor ist die rekursive KernrelationFür jedes
i
Produkt wählen wir entweder die Angabe (als Wiederholung möglich). In diesem Fall teilen wir das gewünschte ProduktN
durchi
und dekrementieren esM
. Wenn wir dies nicht tun, erhöhen wir uns umi
1, aber nur, wenni<N
es keinen Sinn macht, Teiler größer als zu überprüfenN
.Wenn der minimale Teiler
i
überschritten wirdN
, gibt es keine potenziellen Teiler mehr. Wir überprüfen also, ob es uns gelungen ist, indem wir prüfen, obM==0 and N==1
oder gleichwertigM+1==N==1
oderM+1==N<2
seit wannM+1==N
der gegenseitige Wert garantiert eine positive ganze Zahl ist (danke an FryAmTheEggman für diese Optimierung).Dieser Code führt
N
auf den meisten Systemen zu einem Stapelüberlauf von etwa 1000. Sie können ihn jedoch in Stackless Python ausführen , um dies zu vermeiden. Darüber hinaus ist es aufgrund seiner exponentiellen rekursiven Verzweigung extrem langsam.quelle
-~M==N<2
M
undN
. Vielen Dank!Rubin, 67
Eigentlich einigermaßen effizient für eine rekursive Definition. Für jedes Divisorpaar
[d,q]
von n addierend
wir das Ergebnis vonf[q,m-1]
. Der knifflige Teil ist, dass wir in den inneren Aufrufen die Faktoren auf diejenigen begrenzen, die größer oder gleich d sind, damit wir nicht doppelt zählen.quelle
CJam, 48 Bytes
Dies kann viel kürzer sein, aber ich habe einige Checks hinzugefügt, damit es
M
auf dem Online-Compiler funktioniert .Probieren Sie es hier online aus
quelle
2 1
. Erwartete Leistung: 1. Tatsächliche Leistung: 0.T-SQL
456373Ich bin mir sicher, dass dies kaputt geht, wenn die Eingänge fast groß sind.
Vielen Dank an @MickyT für die Unterstützung beim Speichern vieler Zeichen mit CONCAT und SELECTing anstelle mehrerer SETs.
quelle
SET @C+=',# A'+@
undSET @D+='*A'+@+'.A'SET @E+=' AND A'+(@-1)+'.A<=A'+@+'.A'
SET @C+=@D+'=@N'+@E+' SELECT @'
. Das@N
befindet sich innerhalb der Anführungszeichen und liegt außerhalb des Bereichs, wenn Sie es ausführen@C
. Außerdem denke ich, dass du am Ende Duplikate zählenCONCAT
, Ihre Zeichenfolgen zu erstellen. Dann kannst du dasCONVERT
s fallen lassen. Versuchen Sie esSELECT @+=1,@C+=CONCAT(...),@D+=CONCAT(...),@E+=CONCAT(...)
in IhrerWHILE
Schleife. Sollte dir eine vernünftige Nummer