Vous vous demandez si l'expression régulière
(xxx | xxxx | xxxxx) *
matchs xx ... x, où x se produit 456 fois.
Voici une solution dans O (n + a^2), où a est le plus petit des nombres sur le côté gauche (dans ce cas 3).
Supposons que vos numéros soient 6,7,15. Je vais appeler un nombre exprimable sous la forme 6x + 7y + 15z "disponible". Vous devez vérifier si un nombre donné est disponible.
Si vous êtes en mesure d'obtenir un certain nombre n, alors vous serez sûrement capable d'obtenir n + 6, n + 12, n + 18 - en général, n + 6k pour tout k> = 0. Sur le de l'autre côté, si vous ne parvenez pas à obtenir un certain nombre n, alors n-6 n'est certainement pas disponible aussi (si vous pouviez obtenir (n-6), alors (n-6) + 6 = n serait disponible), cela signifie n-12, n-18, n-6k ne sont pas disponibles non plus. Supposons que vous ayez déterminé que 15 est disponible mais que 9 ne l'est pas. Dans notre cas, 15 = 6 * 0 + 7 * 0 + 15 * 1 mais ne pourra en aucun cas en obtenir 9. Donc, par notre raisonnement précédent, 15 + 6k est disponible pour tout k> = 0 et 9-6k pour tout k> = 0 ne l'est pas. Si vous avez un nombre divisé par 6 donne 3 comme reste (3, 9, 15, 21, ...), vous pouvez répondre rapidement: les nombres < = 9 ne sont pas disponibles, les nombres> = 15 sont.
Il suffit de déterminer pour tous les restes de division possibles de 6 (c'est-à-dire 0,1,2,3,4,5) quel est le plus petit nombre disponible. (J'ai juste montré que ce nombre pour le reste 3 est 15). Comment faire: Créez un graphe avec les sommets 0,1,2,3,4,5. Pour tous les nombres k qui vous sont donnés (7,15 - nous ne tenons pas compte de 6) ajoutez une arête de x à (x + k) mod 6. Donnez-lui du poids (x + k) div 6. Utilisez Dijkstra's algorithm en utilisant 0 comme noeud initial . Les distances trouvées par l'algorithme seront exactement les nombres que nous recherchons.
Dans notre cas (6,7,15) le nombre 7 donne lieu à 0 -> 1 (poids 1), 1 -> 2 (poids 1), 2 -> 3 (poids 1), ... , 5 -> 0 (poids 1) et le nombre 15 donne 0 -> 3 (poids 2), 1 -> 4 (poids 2), ..., 5 -> 1 (poids 2). Le chemin le plus court de 0 à 3 a un bord - son poids est 2.Donc 6 * 2 + 3 = 15 est le plus petit nombre qui donne 3 comme reste. 6 * 1 + 3 = 9 n'est pas disponible (eh bien, nous avons vérifié cela précédemment à la main).
Et quelle est la connexion aux expressions régulières? Eh bien, chaque expression régulière a un automate fini équivalent, et j'en ai construit un.
Ce problème, avec plusieurs requêtes autorisées, est apparu sur le Polish Olympiad et j'ai traduit la solution. Maintenant, si vous entendez maintenant une personne dire que l'informatique n'est pas utile pour de vrais programmeurs, frappez-le en face.
Y a-t-il plus de contraintes au problème? Si m est 1 et k1, k2 .. km sont tous plus grands que 1, alors vous ne trouvez pas de solution ... Donc je suppose que m> = k1, k2 ... kn? – Malaxeur
Nous avons vraiment besoin de mathoverflow. – Fragsworth
Lior, merci pour l'explication de l'utilisation. Votre question est devenue beaucoup plus intéressante. –