Disons que vous avez un dé à 20 faces. Vous commencez à lancer ce dé et vous devez le lancer quelques dizaines de fois avant de finalement lancer les 20 valeurs. Vous vous demandez combien de rouleaux ai-je besoin avant d'avoir 50% de chances de voir les 20 valeurs? Et combien de rouleaux de ndé recto dois-je lancer avant de lancer tous les ncôtés?
Après quelques recherches, vous découvrez qu'il existe une formule pour calculer la probabilité de rouler toutes les nvaleurs après les rrouleaux.
P(r, n) = n! * S(r, n) / n**r
où S(a, b)dénote les nombres de Stirling du deuxième type , le nombre de façons de partitionner un ensemble de n objets (chaque rouleau) en k sous-ensembles non vides (chaque côté).
Vous trouverez également la séquence OEIS , que nous appellerons R(n), qui correspond à la plus petite roù P(r, n)est d'au moins 50%. Le défi consiste à calculer le nterme de cette séquence le plus rapidement possible.
Le défi
- Étant donné un
n, trouvez le plus petitroùP(r, n)est supérieur ou égal à0.5ou 50%. - Votre code devrait théoriquement gérer tout entier non négatif
nen entrée, mais nous ne testerons votre code que dans la plage de1 <= n <= 1000000. - Pour la notation, nous allons prendre le temps total nécessaire pour faire fonctionner
R(n)sur les intrants1par10000. - Nous vérifierons si vos solutions sont correctes en exécutant notre version de
R(n)sur votre sortie pour voir siP(your_output, n) >= 0.5etP(your_output - 1, n) < 0.5, c'est-à-dire que votre sortie est réellement la plus petiterpour une donnéen. - Vous pouvez utiliser n'importe quelle définition pour
S(a, b)dans votre solution. Wikipedia a plusieurs définitions qui peuvent être utiles ici. - Vous pouvez utiliser des fonctions intégrées dans vos solutions, y compris celles qui calculent
S(a, b)ou même celles qui calculentP(r, n)directement. - Vous pouvez coder en dur jusqu'à 1000 valeurs
R(n)et un million de nombres de Stirling, mais aucune de ces limites n'est stricte et peut être modifiée si vous pouvez faire un argument convaincant pour les augmenter ou les diminuer. - Vous n'avez pas besoin de vérifier tous les possibles
rentrenet ceux quernous recherchons, mais vous devez trouver le plus petitret pas n'importeroùP(r, n) >= 0.5. - Votre programme doit utiliser un langage librement exécutable sur Windows 10.
Les spécifications de l'ordinateur qui testera vos solutions sont i7 4790k, 8 GB RAM. Merci à @DJMcMayhem d' avoir fourni son ordinateur pour les tests. N'hésitez pas à ajouter votre propre timing non officiel pour référence, mais le timing officiel sera fourni plus tard une fois que DJ pourra le tester.
Cas de test
n R(n)
1 1
2 2
3 5
4 7
5 10
6 13
20 67 # our 20-sided die
52 225 # how many cards from a huge uniformly random pile until we get a full deck
100 497
366 2294 # number of people for to get 366 distinct birthdays
1000 7274
2000 15934
5000 44418
10000 95768
100000 1187943
1000000 14182022
Faites-moi savoir si vous avez des questions ou des suggestions. Bonne chance et bonne optimisation!