[Python] Nombre de chaînes entières de longueur n pour lesquelles la somme est m

Aperçu

Challenge from Dwango Qualifying C --Kill / Death Afin de résoudre, le total devient une certaine valeur (positive) Nous avions besoin du nombre de colonnes entières et du nombre de combinaisons uniques de celles-ci. Les deux peuvent être énumérés sur un tableau à deux dimensions avec $ O (nm) $ lorsque la longueur de la chaîne entière est $ n $ et la somme est $ m $.

Trouver le nombre de chaînes entières

Par exemplem=4, n=3Quand,● ● ● ●Peut être considéré comme se divisant en trois compartiments, par exemple● ● | ● | ●Cela peut être exprimé par. Il s'agit de savoir où placer $ n-1 $ | à $ m + n-1 $, et le nombre de combinaisons est $ _ {n-1 + m} C _ {n- Il est calculé par 1} $, et dans cet exemple, il y a $ _6 C _2 = 15 $. <détails>

Énumération des colonnes entières </ summary>

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
Parmi ces séquences d'entiers, par exemple, «400», «0 4 0» et «0 0 4» consistent en la même combinaison dans un ordre différent.

Énumérer le nombre de colonnes entières

Comme il faut du temps pour calculer $ _n C _r $ en fonction de la manière dont la valeur est prise, il existe des cas où l'accélération peut être obtenue en énumérant le nombre de chaînes d'entiers. Ici, l'équation graduelle suivante est utilisée. $ P (n, m) $ est le nombre de colonnes entières de longueur $ n $ et somme $ 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}

Le nombre de colonnes entières dont la somme est exactement $ j $ jusqu'au $ i $ ème élément est le nombre de colonnes entières dont la somme est exactement $ j $ à l'élément $ i-1 $ ème (c'est-à-dire que l'élément $ i $ ème est (Quand $ 0 $) et le nombre de colonnes entières dont la somme est exactement $ j-1 $ jusqu'au $ i $ ème élément. Il peut être mis en œuvre comme suit.

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())

Compréhension intuitive des formules graduelles

Énumération d'une chaîne entière de $ P (2,4) $

4 0 0
#Jusqu'ici c'est P(1,4)

0 4 0
3 1 0
2 2 0
1 3 0
#Jusqu'ici c'est P(2,4)

Maintenant, si vous soustrayez $ 1 $ de tous les seconds éléments d'une chaîne entière dont la longueur peut être représentée par exactement $ 2 $

0 3
3 0
2 1
1 2

Et nous obtenons une chaîne entière de $ P (2,3) $. Inversement, si vous ajoutez $ 1 $ à tous les deuxièmes éléments de $ P (2,3) $, le deuxième élément sera de 0 $ ou plus, donc la somme qui peut être représentée par exactement 2 $ de longueur est de 4 $ $. Vous obtenez une chaîne entière.

Lister le nombre de combinaisons

Recherchez le nombre de combinaisons uniques des chaînes d'entiers répertoriées précédemment, en excluant les mêmes combinaisons dans des ordres différents. $ C (n, m) $ est une combinaison de $ n $ entiers qui donne un total de $ m $, et est calculé par l'équation graduelle suivante.

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}

Le nombre de colonnes entières jusqu'au $ i $ ème élément dont la somme est exactement $ j $ est le nombre de colonnes entières dont la somme est exactement $ j $ à l'élément $ i-1 $ ème (c'est-à-dire que l'élément $ i $ ème est (Quand $ 0 $) et le nombre de colonnes entières dont la somme est exactement $ ji $ jusqu'au $ i $ ème élément. Il peut être mis en œuvre comme suit.

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())

Compréhension intuitive des formules graduelles

Si vous énumérez $ C (3,4) $,

4 0 0
#Jusqu'ici c'est C(1,4)

2 2 0
3 1 0
#Jusqu'ici c'est C(2,4)

2 1 1
#Jusqu'ici c'est C(3,4)

Sera. Au fait, si vous utilisez * pour représenter une combinaison d'entiers dont la longueur est exactement de 2 $ et dont la somme est de 4 $.


2 * *
2 * *
0

3 * * *
1 *
0

Si vous transposez ceci et lisez-le

2 2
* *
* *

2 1 1
* * *
*

Par conséquent, une combinaison d'entiers d'une longueur d'exactement $ 2 $ et d'une somme de 4 $ $ peut être lue comme une combinaison d'entiers de n'importe quelle longueur avec une valeur maximale de 2 $ $ et une somme de 4 $ $. Ici, on peut voir que la combinaison d'entiers après translocation commence toujours par $ 2 $, et par la suite elle peut être représentée par la combinaison d'entiers de $ C (2,4-2) = C (2,2) $.

référence

Mathematics Girl ★ Jouez avec la formule graduelle du numéro de partition --incognita et cognita

Recommended Posts

[Python] Nombre de chaînes entières de longueur n pour lesquelles la somme est m
À quoi sert le trait de soulignement Python (_)?
Changer la longueur des chaînes csv Python
[Exemple d'amélioration de Python] Quel est le site d'apprentissage recommandé pour les débutants en Python?
Le nombre est-il équivalent à un entier?
[python] [meta] Le type de python est-il un type?
Pandas du débutant, par le débutant, pour le débutant [Python]
Alignez le nombre d'échantillons entre les classes de données pour l'apprentissage automatique avec Python
Sortie du nombre de cœurs de processeur en Python
L'histoire selon laquelle le coût d'apprentissage de Python est faible
La réponse de "1/2" est différente entre python2 et 3
Wagtail est le meilleur CMS pour Python! (Peut-être)
Calculez le nombre total de combinaisons avec python
Traitement d'image? L'histoire du démarrage de Python pour
Ceci est le seul examen de base de Python ~ 1 ~
Ceci est le seul examen de base de Python ~ 2 ~
Code pour vérifier le fonctionnement de Python Matplot lib
Ceci est le seul examen de base de Python ~ 3 ~
Un script python qui obtient le nombre de travaux pour une condition spécifiée sur Indeed.com
Vérifiez le temps de traitement et le nombre d'appels pour chaque processus avec python (cProfile)
Vérifiez si la chaîne est un nombre en python
[Python] Un programme qui compte le nombre de vallées
Comment obtenir le nombre de chiffres en Python
Obtenir la taille (nombre d'éléments) de Union Find en Python
Electron est la meilleure solution pour le développement multi-plateforme de Python
Trouvez la valeur maximale, la valeur minimale et le nombre d'éléments lorsque l'entier N est suivi de N entiers sur la première ligne de l'entrée standard.
Pourquoi le premier argument de la classe [Python] est-il self?
[Python] Obtenez le nombre de vues de tous les articles publiés
le zen de Python
Obtenez le nombre d'éléments spécifiques dans la liste python
Python --Trouvez le nombre de groupes dans l'expression regex
[Python] Qui est exécuté en premier, variable de classe ou __init__?
Prise en compte des décorateurs Python du type qui passe des variables
[Homologie] Comptez le nombre de trous dans les données avec Python
Scrapy-Redis est recommandé pour l'exploration d'un grand nombre de domaines
Obtenez le nombre d'occurrences pour chaque élément de la liste
Quelle est la meilleure méthode pour le traitement asynchrone du serveur TCP?
Quelle est la version TLS par défaut du module de requêtes python?
La fonction d'affichage d'image d'iTerm est pratique lors du traitement d'images.
[Python] Les principales faiblesses et inconvénients de Google Colaboratory [Pour les débutants]
Google recherche la chaîne sur la dernière ligne du fichier en Python
Installation des paramètres initiaux Mac-Python (pyenv) au plus vite
Agréger les appels quotidiens par seconde à partir des journaux du serveur Web en Python