AtCoder # 51 quotidien avec Python

introduction

Dernière fois

#51 Problème

** Pensées ** Dans la production, j'ai recherché $ i, j $ complètement et TLE. Le montant du calcul est de $ O ((2 * 10 ^ 5) ^ {2}) $. Avec la limitation de ce problème, il ne passera pas à moins qu'il ne soit supprimé à environ $ O (N) $.

Les nombres exprimés en décimal peuvent être exprimés comme $ a_i * 10 ^ n + a_ {i-1} * 10 ^ {n-1} \ cdots a_0 * 10 ^ 0 $. Si la chaîne de caractères $ S $ de longueur $ N $ est divisée par $ i $ th à partir de la droite et la chaîne de caractères est $ S_i $, $ S_i $ est $ S_0 + S_1 * 10 ^ 1 \ cdots S_i * 10 ^ { Il peut être exprimé par Ni} $. Puisqu'il n'est pas possible de combiner des caractères séparément, la chaîne de caractères $ S_ {ij} $ dans l'intervalle de $ i, j, i <j $ in $ S $ est $ S_ {ij} = \ frac {S_ {j } -S_ {i}} {10 ^ i} $ peut être écrit. Où $ 2019,10 ^ i $ sont les uns par rapport aux autres (l'engagement maximal est de 1). Par conséquent, pour déterminer si $ S_ {ij} $ est un multiple de 2019, le dénominateur de l'équation précédente ($ \ frac {S_ {j} -S_ {i}} {10 ^ i} $) est un multiple de 2019. C'est la même valeur que le jugement qu'il y a. De plus, si vous soustrayez deux nombres différents avec le même reste divisé par 2019, vous obtenez un nombre divisible par 2019. Donc, enregistrez $ S_ {i} mod (2019) $ de $ i $ respectivement. Je suis tombé sur une liste pour enregistrer le reste. Le reste $ m $ divisé par 2019 sera naturellement 0 $ \ leq m <2019 $, mais seulement lorsque le reste est égal à 0, $ S_i $ seul peut être un multiple de 2019. Par conséquent, le terme du reste 0 dans la liste qui enregistre le reste doit être +1 au début. Ce +1 a une chaîne de caractères de longueur 0, et quand il est trop 0, il est associé à une chaîne de caractères de longueur 0 → On a l'impression que ce sera un multiple de 2019 par lui-même. La formule pour calculer la combinaison est $ n \ * (n-1) $ en transformant $ {} _n C _2 $.

s = input()

t, a = 0, 1
mod = [0]*2019
mod[0] = 1 #Premier élément(Reste 0)Est+1
s = s[::-1] #Il est plus facile de classer si vous regardez de derrière, alors inversez
n = len(s)
for i in range(n):
    t += int(s[i]) * a
    t %= 2019
    a *= 10
    a %= 2019 #Parce qu'ils sont tous les deux%La réponse t ne change pas même si 2019 est calculé
    mod[t] += 1
ans = 0

for i in range(2019):
    ans += mod[i]*(mod[i]-1)//2 #Calcul des combinaisons
print(ans)

Dois-je écrire t, a = 0, 1 sur une autre ligne? Je ne l'ai pas trouvé dans PEP8.

Résumé

Je voulais le résoudre en production. Je suis plus heureux cette semaine parce que j'ai deux ABC donc je vais prendre un thé. à plus.

Recommended Posts

AtCoder # 36 quotidien avec Python
Daily AtCoder # 32 en Python
Daily AtCoder # 6 en Python
Daily AtCoder # 18 en Python
Daily AtCoder # 53 en Python
AtCoder # 7 tous les jours avec Python
AtCoder # 24 tous les jours avec Python
Daily AtCoder # 37 en Python
AtCoder # 8 tous les jours avec Python
Daily AtCoder # 42 en Python
AtCoder # 21 quotidien avec Python
Daily AtCoder # 17 avec Python
Daily AtCoder # 38 en Python
Daily AtCoder # 54 en Python
Daily AtCoder # 11 en Python
Daily AtCoder # 15 en Python
Daily AtCoder # 13 en Python
AtCoder # 45 quotidien avec Python
AtCoder # 30 tous les jours en Python
AtCoder # 40 quotidien avec Python
AtCoder # 10 quotidien avec Python
AtCoder # 5 tous les jours avec Python
Daily AtCoder # 28 en Python
AtCoder # 39 quotidien avec Python
Daily AtCoder # 20 en Python
Daily AtCoder # 19 en Python
Daily AtCoder # 52 en Python
Daily AtCoder # 3 en Python
Daily AtCoder # 14 avec Python
Daily AtCoder # 50 avec Python
Daily AtCoder # 26 avec Python
AtCoder quotidien # 4 avec Python
Daily AtCoder # 43 en Python
Daily AtCoder # 29 en Python
Tous les jours avec Python AtCoder # 22
Daily AtCoder # 49 en Python
Daily AtCoder # 27 en Python
AtCoder # 1 tous les jours avec Python
Daily AtCoder # 25 avec Python
Daily AtCoder # 16 en Python
Daily AtCoder # 12 en Python
Daily AtCoder # 48 en Python
Daily AtCoder # 34 en Python
AtCoder # 51 quotidien avec Python
Daily AtCoder # 31 en Python
Daily AtCoder # 46 en Python
AtCoder # 35 quotidien avec Python
AtCoder # 9 tous les jours avec Python
Daily AtCoder # 44 avec Python
Daily AtCoder # 41 en Python
atCoder 173 Python
Note d'entrée Python dans AtCoder
Atcoder ABC165 A-D en Python
Atcoder ABC166 A-E en Python
Atcoder ABC169 A-E en Python
AtCoder ABC177 A-D avec python
Résoudre Atcoder ABC169 A-D avec Python
[Python] Connaissances de base utilisées dans AtCoder
Python en optimisation
CURL en Python
Métaprogrammation avec Python