[Python] Anzahl der Ganzzahlzeichenfolgen der Länge n, für die die Summe m ist

Überblick

Herausforderung von Dwango Qualifying C --Kill / Death Um zu lösen, wird die Summe zu einem bestimmten Wert (positiv). Wir brauchten die Anzahl der Ganzzahlspalten und die Anzahl der eindeutigen Kombinationen davon. Beide können in einem zweidimensionalen Array mit $ O (nm) $ aufgelistet werden, wenn die Länge der Ganzzahlzeichenfolge $ n $ und die Summe $ m $ beträgt.

Finden Sie die Anzahl der Ganzzahlzeichenfolgen

Als Beispielm=4, n=3Wann,● ● ● ●Kann zum Beispiel in drei Fächer unterteilt werden● ● | ● | ●Es kann ausgedrückt werden als. Dies ist eine Frage, wo $ n-1 $ | bei $ m + n-1 $ platziert werden soll, und die Anzahl der Kombinationen beträgt $ _ {n-1 + m} C _ {n- Es wird mit 1} $ berechnet, und in diesem Beispiel gibt es $ _6 C _2 = 15 $.

Aufzählen von Ganzzahlspalten
4 0 0
3 0 1
3 1 0
2 0 2
2 1 1
2 2 0
1 0 3
1 1 2
1 2 1
1 3 0
0 0 4
0 1 3
0 2 2
0 3 1
0 4 0
Von diesen ganzzahligen Sequenzen bestehen beispielsweise "400", "0 4 0" und "0 0 4" aus derselben Kombination in einer anderen Reihenfolge.

Zählen Sie die Anzahl der Ganzzahlspalten auf

Da die Berechnung von $ _n C _r $ abhängig von der Art und Weise, wie der Wert verwendet wird, einige Zeit in Anspruch nimmt, kann in einigen Fällen eine Beschleunigung durch Aufzählung der Anzahl ganzzahliger Zeichenfolgen erreicht werden. Hier wird die folgende allmähliche Gleichung verwendet. $ P (n, m) $ ist die Anzahl der ganzzahligen Spalten mit der Länge $ n $ und der Summe $ m $.

P(n,m)= 
\begin{cases}
1 & (n,m=0)\\

P(n-1,m) & (m=0, 1 \leq n) \\
P(n-1,m)+P(n,m-1) & (1 \leq m, 1 \leq n) \\
0 & (otherwise) 
\end{cases}

Die Anzahl der Ganzzahlspalten, deren Summe bis zum $ i $ -ten Element genau $ j $ beträgt, ist die Anzahl der Ganzzahlspalten, deren Summe beim $ i-1 $ -ten Element genau $ j $ beträgt (dh das $ i $ -te Element ist (Wenn $ 0 $) und die Anzahl der ganzzahligen Spalten, deren Summe genau $ j-1 $ bis zum $ i $ -ten Element ist. Es kann wie folgt implementiert werden.

P = []
cur = [0]*(m+1)
cur[0] = 1
for i in range(1, n+1):
    for j in range(1, m+1):
        cur[j] += cur[j-1]
    P.append(cur.copy())

Intuitives Verständnis von schrittweisen Formeln

Aufzählung einer Ganzzahlzeichenfolge von $ P (2,4) $

4 0 0
#Bis hierher ist P.(1,4)

0 4 0
3 1 0
2 2 0
1 3 0
#Bis hierher ist P.(2,4)

Wenn Sie nun $ 1 $ von allen zweiten Elementen einer Ganzzahlzeichenfolge subtrahieren, deren Länge durch genau $ 2 $ dargestellt werden kann

0 3
3 0
2 1
1 2

Und wir erhalten eine ganzzahlige Zeichenfolge von $ P (2,3) $. Wenn Sie dagegen $ 1 $ zu allen zweiten Elementen von $ P (2,3) $ hinzufügen, beträgt das zweite Element $ 0 $ oder mehr, sodass die Summe, die durch genau $ 2 $ Länge dargestellt werden kann, $ 4 $ beträgt. Sie erhalten eine Ganzzahlzeichenfolge.

Listen Sie die Anzahl der Kombinationen auf

Ermitteln Sie die Anzahl der eindeutigen Kombinationen der zuvor aufgeführten Ganzzahlzeichenfolgen, wobei dieselben Kombinationen in unterschiedlicher Reihenfolge ausgeschlossen sind. $ C (n, m) $ ist eine Kombination von $ n $ ganzen Zahlen, die $ m $ ergibt und durch die folgende allmähliche Gleichung berechnet wird.

C(n,m)= 
\begin{cases}
1 & (n,m=0)\\

C(n-1,m) & (m < n, 1 \leq n) \\
C(n-1,m)+C(n,m-n) & (n \leq m, 1 \leq n) \\
0 & (otherwise) 
\end{cases}

Die Anzahl der ganzzahligen Spalten bis zum $ i $ -ten Element, dessen Summe genau $ j $ ist, ist die Anzahl der ganzzahligen Spalten, deren Summe genau $ j $ am $ i-1 $ -ten Element ist (dh das $ i $ -te Element ist (Wenn $ 0 $) und die Anzahl der ganzzahligen Spalten, deren Summe genau $ ji $ bis zum $ i $ -ten Element ist. Es kann wie folgt implementiert werden.

C = []
cur = [0]*(m+1)
cur[0] = 1
for i in range(1, n+1):
    for j in range(i, m+1):
        cur[j] += cur[j-i]
    C.append(cur.copy())

Intuitives Verständnis von schrittweisen Formeln

Wenn Sie $ C (3,4) $ aufzählen,

4 0 0
#Bis hierher ist C.(1,4)

2 2 0
3 1 0
#Bis hierher ist C.(2,4)

2 1 1
#Bis hierher ist C.(3,4)

Wird sein. Übrigens, wenn Sie * verwenden, um eine Kombination von ganzen Zahlen darzustellen, deren Länge genau $ 2 $ und deren Summe $ 4 $ beträgt.


2 * *
2 * *
0

3 * * *
1 *
0

Wenn Sie dies transponieren und lesen

2 2
* *
* *

2 1 1
* * *
*

Daher kann eine Kombination von ganzen Zahlen mit einer Länge von genau $ 2 $ und einer Summe von $ 4 $ als eine Kombination von ganzen Zahlen beliebiger Länge mit einem Maximalwert von $ 2 $ und einer Summe von $ 4 $ gelesen werden. Hier ist zu sehen, dass die Kombination von ganzen Zahlen nach der Translokation immer mit $ 2 $ beginnt und danach durch die Kombination von ganzen Zahlen von $ C (2,4-2) = C (2,2) $ dargestellt werden kann.

Referenz

Mathematics Girl ★ Spielen Sie mit der schrittweisen Formel der Partitionsnummer --incognita et cognita

Recommended Posts

[Python] Anzahl der Ganzzahlzeichenfolgen der Länge n, für die die Summe m ist
Wofür ist der Python-Unterstrich (_)?
Ändern Sie die Länge der Python-CSV-Zeichenfolgen
[Beispiel für eine Python-Verbesserung] Was ist die empfohlene Lernseite für Python-Anfänger?
Entspricht die Zahl einer Ganzzahl?
[Python] [Meta] Ist der Python-Typ ein Typ?
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
Richten Sie die Anzahl der Stichproben zwischen Datenklassen für maschinelles Lernen mit Python aus
Geben Sie die Anzahl der CPU-Kerne in Python aus
Die Geschichte, dass die Lernkosten von Python niedrig sind
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
Bachstelze ist das beste CMS für Python! (Vielleicht)
Berechnen Sie die Gesamtzahl der Kombinationen mit Python
Bildverarbeitung? Die Geschichte, Python für zu starten
Dies ist die einzige grundlegende Überprüfung von Python ~ 1 ~
Dies ist die einzige grundlegende Überprüfung von Python ~ 2 ~
Code zum Überprüfen des Betriebs von Python Matplot lib
Dies ist die einzige grundlegende Überprüfung von Python ~ 3 ~
Ein Python-Skript, das die Anzahl der Jobs für eine bestimmte Bedingung von Indeed.com abruft
Überprüfen Sie die Verarbeitungszeit und die Anzahl der Aufrufe für jeden Prozess mit Python (cProfile).
Überprüfen Sie, ob die Zeichenfolge eine Zahl in Python ist
[Python] Ein Programm, das die Anzahl der Täler zählt
So ermitteln Sie die Anzahl der Stellen in Python
Ermitteln Sie die Größe (Anzahl der Elemente) von Union Find in Python
Electron ist die beste Lösung für die plattformübergreifende Entwicklung von Python
Suchen Sie den Maximalwert, den Minimalwert und die Anzahl der Elemente, wenn auf die Ganzzahl N N Ganzzahlen in der ersten Zeile mit Standardeingabe folgen.
Warum ist das erste Argument der [Python] -Klasse selbst?
[Python] Ermittelt die Anzahl der Aufrufe aller veröffentlichten Artikel
der Zen von Python
Holen Sie sich die Anzahl der spezifischen Elemente in der Python-Liste
Python - Ermitteln Sie die Anzahl der Gruppen im regulären Ausdruck
[Python] Was wird zuerst ausgeführt, Klassenvariable oder __init__?
Berücksichtigung von Python-Dekoratoren des Typs, der Variablen übergibt
[Homologie] Zählen Sie mit Python die Anzahl der Löcher in den Daten
Scrapy-Redis wird zum Crawlen einer großen Anzahl von Domänen empfohlen
Ermitteln Sie die Anzahl der Vorkommen für jedes Element in der Liste
Welche Methode eignet sich am besten für die asynchrone Verarbeitung des TCP-Servers?
Was ist die Standard-TLS-Version des Python-Anforderungsmoduls?
Die Bildanzeigefunktion von iTerm ist praktisch bei der Verarbeitung von Bildern.
[Python] Die größten Schwächen und Nachteile von Google Colaboratory [Für Anfänger]
Google sucht mit Python nach der Zeichenfolge in der letzten Zeile der Datei
Mac Initial Settings-Python (pyenv) Installation am schnellsten
Aggregieren Sie die täglichen Treffer pro Sekunde aus den Webserver-Protokollen in Python