L'idée derrière cette réponse peut vous aider à développer très rapidement une solution. Avoir des plages de 0..2^N la complexité d'un potentiel algorithme O(N) dans le pire des cas (en Supposant que la complexité d'un long calcul est O(1)) Si elle est programmée correctement, il devrait facilement manipuler N = 1000000 en quelques millisecondes.
Imaginez, nous avons les valeurs suivantes:
LO = 0; (0000000000000000000000000000000)
HI = 2147483647; (1111111111111111111111111111111)
Le plus bas possible N1 dans la plage de LO..SALUT 0
Le plus élevé possible N1 dans la plage de LO..HI est de 31
Donc le calcul de N2..NN partie est faite que pour l'un des 32 valeurs (0..31).
Ce qui peut être fait simplement, même sans ordinateur.
Maintenant passons à calculer le montant de N1=X pour une plage de valeurs LO..SALUT
Lorsque nous avons X = 0, nous avons count(N1=X) = 1 c'est la valeur suivante:
1 0000000000000000000000000000000
Lorsque nous avons X = 1, nous avons count(N1=X) = 31 ce sont les valeurs suivantes:
01 1000000000000000000000000000000
02 0100000000000000000000000000000
03 0010000000000000000000000000000
...
30 0000000000000000000000000000010
31 0000000000000000000000000000001
Lorsque nous avons X = 2, nous avons le schéma suivant:
1100000000000000000000000000000
Combien de chaînes uniques peut être formé de 29 '0' et de 2 '1'?
Imaginez le plus à droite de '1'(#1) est le vélo de gauche à droite, nous obtenons l'image suivante:
01 1100000000000000000000000000000
02 1010000000000000000000000000000
03 1001000000000000000000000000000
...
30 1000000000000000000000000000001
Maintenant, nous avons plus de 30 chaînes en déplaçant le " 1 " (#1) de gauche à droite, il est maintenant impossible de
créer une chaîne unique en déplaçant le " 1 " (#1) dans n'importe quelle direction. Cela signifie que nous devrions aller à '1'(#2) vers la droite,
nous allons également réinitialiser la position de '1'(#1) que de la gauche que possible en restant unicité, nous obtenons:
01 0110000000000000000000000000000
maintenant, nous ne le vélo de '1'(#1) une fois de plus
02 0101000000000000000000000000000
03 0100100000000000000000000000000
...
29 0100000000000000000000000000001
Maintenant, nous avons du 29 chaînes uniques, de la poursuite de cette opération 28 fois nous obtenons l'expression suivante
count(N1=2) = 30 + 29 + 28 + ... + 1 = 465
Lorsque nous avons X = 3 l'image reste similaire, mais nous allons de l''1'(#1), '1'(#2), '1'(#3)
Déplacer le " 1 " (#1) crée 29 chaînes uniques, lorsque nous avons commencer à bouger '1'(#2) nous obtenons
29 + 28 + ... + 1 = 435 chaînes uniques, après qu'il nous reste à traiter de '1'(#3) nous avons donc
29 + 28 + ... + 1 = 435
28 + ... + 1 = 406
...
+ 1 = 1
435 + 406 + 378 + 351 + 325 + 300 + 276 +
253 + 231 + 210 + 190 + 171 + 153 + 136 +
120 + 105 + 091 + 078 + 066 + 055 + 045 +
036 + 028 + 021 + 015 + 010 + 006 + 003 + 001 = 4495
Nous allons essayer de résoudre le cas général, c'est à dire quand on a N zéros et M celles.
Montant global de permutations pour la chaîne de caractères de longueur (N + M) est égale à (N + M)!
Le montant de '0' doublons dans cette chaîne est égal à N!
Le nombre de " 1 " doublons dans cette chaîne est égale à M!
en recevant ainsi la quantité globale de chaînes uniques formé de N zéros et M est
(N + M)! 32! 263130836933693530167218012160000000
F(N, M) = ============= => ========== = ====================================== = 4495
(N!) * (M!) 3! * 29! 6 * 304888344611713860501504000000
Edit:
F(N, M) = Binomial(N + M, M)
Prenons maintenant un exemple réel:
LO = 43797207; (0000010100111000100101011010111)
HI = 1562866180; (1011101001001110111001000000100)
Alors, comment pouvons-nous appliquer notre unique permutations formule à cet exemple? Puisque nous ne savons pas comment
beaucoup de " 1 "est situé en dessous de LO et de la façon dont beaucoup de" 1 " est situé au-dessus de SALUT.
Donc permet de compter ces permutations ci-dessous LO et HI.
Rappelons-nous comment nous avons parcouru '1'(#1), '1'(#2), ...
1111100000000000000000000000000 => 2080374784
1111010000000000000000000000000 => 2046820352
1111001000000000000000000000000 => 2030043136
1111000000000000000000000000001 => 2013265921
1110110000000000000000000000000 => 1979711488
1110101000000000000000000000000 => 1962934272
1110100100000000000000000000000 => 1954545664
1110100010000000000000000000001 => 1950351361
Comme vous le voyez, ce vélo processus diminue les valeurs décimales en douceur. Nous avons donc besoin de compter la quantité de
cycles jusqu'à ce que nous atteignons SALUT valeur. Mais nous ne devrions pas compter ces valeurs par un parce que
le pire des cas, peut générer jusqu'à 32!/(16!*16!) = 601080390 cycles, ce qui nous permettra d'être à vélo très longtemps :)
Nous avons donc besoin d'cycle des morceaux de '1' à la fois.
Le fait d'avoir notre exemple, nous voulons compter le montant des cycles de transformation
1111100000000000000000000000000 => 1011101000000000000000000000000
1011101001001110111001000000100
Alors, combien de cycles provoque la transformation
1111100000000000000000000000000 => 1011101000000000000000000000000
?
Permet de voir, à la transformation:
1111100000000000000000000000000 => 1110110000000000000000000000000
est égal à l'ensemble des cycles:
01 1111100000000000000000000000000
02 1111010000000000000000000000000
...
27 1111000000000000000000000000001
28 1110110000000000000000000000000
Nous avons donc besoin d'28 cycles de transformer
1111100000000000000000000000000 => 1110110000000000000000000000000
Combien de cycles devons-nous transformer
1111100000000000000000000000000 => 1101110000000000000000000000000
l'exécution se déplace suivant nous avons besoin de:
1110110000000000000000000000000 28 cycles
1110011000000000000000000000000 27 cycles
1110001100000000000000000000000 26 cycles
...
1110000000000000000000000000011 1 cycle
et 1 cycle pour la réception:
1101110000000000000000000000000 1 cycle
ainsi, la réception de 28 + 27 + ... + 1 + 1 = 406 + 1
mais nous avons vu cette valeur avant et c'était le résultat pour le montant de l'unique permutations, qui a été
calculée pour 2 '1' et 27 '0'. Cela signifie que la quantité de cycles tout en se déplaçant
11100000000000000000000000000 => 01110000000000000000000000000
est égal au déménagement
_1100000000000000000000000000 => _0000000000000000000000000011
plus un autre cycle
donc, cela signifie que si nous avons M zéros et N et souhaitez déplacer le bloc de U '1' à la droite, nous aurons besoin de
procédez de la manière suivante quantité de cycles:
(U - 1 + M)!
1 + =============== = f(U, M)
M! * (U - 1)!
Edit:
f(U, M) = 1 + Binomial(U - 1 + M, M)
Revenons maintenant à notre exemple réel:
LO = 43797207; (0000010100111000100101011010111)
HI = 1562866180; (1011101001001110111001000000100)
donc, ce que nous voulons faire est de compter la quantité de cycles nécessaires pour effectuer les tâches suivantes
transformations (supposons que N1 = 6)
1111110000000000000000000000000 => 1011101001000000000000000000000
1011101001001110111001000000100
elle est égale à:
1011101001000000000000000000000 1011101001000000000000000000000
------------------------------- -------------------------------
_111110000000000000000000000000 => _011111000000000000000000000000 f(5, 25) = 118756
_____11000000000000000000000000 => _____01100000000000000000000000 f(2, 24) = 301
_______100000000000000000000000 => _______010000000000000000000000 f(1, 23) = 24
________10000000000000000000000 => ________01000000000000000000000 f(1, 22) = 23
donc 119104 "perdu" des cycles qui sont situés au-dessus de SALUT
Quant à LO, il n'y a effectivement pas de différence dans quelle direction nous sommes à vélo
donc, pour le calcul de LO, nous pouvons faire la randonnée à vélo:
0000010100111000100101011010111 0000010100111000100101011010111
------------------------------- -------------------------------
0000000000000000000000000111___ => 0000000000000000000000001110___ f(3, 25) = 2926
00000000000000000000000011_____ => 00000000000000000000000110_____ f(2, 24) = 301
Donc 3227 "perdu" des cycles qui sont situés en dessous de LO cela signifie que
overall amount of lost cycles = 119104 + 3227 = 122331
overall amount of all possible cycles = F(6, 25) = 736281
N1 in range 43797207..1562866180 is equal to 736281 - 122331 = 613950
J'ai l'habitude de fournir à la partie restante de la solution. Il n'est pas difficile de saisir la partie restante. Bonne chance!