Résumé
Compte tenu de l' entrée k, trouver une partition d'entiers 1à nen ksous - ensembles sans somme pour le plus grand npossible dans les 10 minutes.
Contexte: numéros Schur
Un ensemble Aest sans somme si son auto-somme A + A = { x + y | x, y in A}n'a aucun élément en commun avec lui.
Pour chaque entier positif, kil y a un plus grand entier S(k)tel que l'ensemble {1, 2, ..., S(k)}peut être partitionné en ksous-ensembles sans somme. Ce numéro est appelé le k ème numéro Schur (OEIS A045652 ).
Par exemple S(2) = 4,. Nous pouvons partitionner en {1, 2, 3, 4}tant que {1, 4}, {2, 3}, et c'est la partition unique en deux sous-ensembles sans somme, mais nous ne pouvons pas maintenant ajouter un 5à l' une ou l'autre partie.
Défi
Écrivez un programme déterministe qui fait ce qui suit:
- Prendre un entier positif
ken entrée - Ecrire l'horodatage Unix actuel sur stdout
- Génère une séquence de partitions de
1ànenksous-ensembles sans somme à augmentern, en suivant chaque séquence avec l'horodatage Unix actuel.
Le gagnant sera le programme qui imprime une partition pour la plus grande ndans les 10 minutes sur mon ordinateur lorsqu'il est saisi 5. Les liens seront rompus par le temps le plus rapide pour trouver une partition pour le plus grand n, en moyenne sur trois exécutions: c'est pourquoi la sortie devrait inclure des horodatages.
Détails importants:
- J'ai Ubuntu Precise, donc si votre langue n'est pas prise en charge, je ne pourrai pas la noter.
- J'ai un processeur Intel Core2 Quad, donc si vous voulez utiliser le multithreading, il est inutile d'utiliser plus de 4 threads.
- Si vous souhaitez que j'utilise des indicateurs ou une implémentation de compilateur particuliers, documentez-le clairement dans votre réponse.
- Vous ne devez pas casse spéciale votre code pour gérer l'entrée
5. - Vous n'êtes pas obligé de générer chaque amélioration trouvée. Par exemple, pour l'entrée,
2vous ne pouvez générer que la partitionn = 4. Cependant, si vous ne produisez rien dans les 10 premières minutes, je noterai celan = 0.
n=59et le tri par le plus grand nombre de nombres autorisés moins que le nombrenextNdonnén=64. Le tri selon la longueur de la liste des numéros non autorisés (qui peut avoir des répétitions) conduit très rapidement à unn=30motif élégant .