AtCoder Beginner Contest 177 Problème C J'ai essayé de découvrir pourquoi c'était faux

introduction

J'étais désespérément accro au problème C du concours177 tenu le 29 août 2020, alors j'ai enquêté dessus.

problème

https://atcoder.jp/contests/abc177/tasks/abc177_c

Pensées

Lorsque calculé correctement, je pensais que ce serait probablement TLE. Mais avec un peu d'ingéniosité, cela semble tout à fait vrai.

Réfléchissez un moment.

Nous sommes arrivés à la conclusion que la somme souhaitée était {(A1 + A2 +… + An) ^ 2- (A1 ^ 2 + A2 ^ 2 +… + An ^ 2)} ÷ 2, et l'avons codée. Terminé en 10 minutes environ.

c.py


n = int(input())
l = input()
a = l.split(' ')

tmp = 0
tmp2 = 0

for i in range(n):
    tmp += int(a[i])

for i in range(n):
    tmp2 += int(a[i])*int(a[i])

print(int((tmp*tmp-tmp2)/2)%1000000007)

D'accord, je suis en forme aujourd'hui! Vous pourrez peut-être poser 4 questions! Dès que j'ai pensé, le jugement était implacable. image.png Il se fige ici et la journée se termine par deux questions.

Pourquoi

Une fois le concours terminé, consultez le commentaire. ne sait pas. Pourquoi? La somme cumulée et cette méthode de calcul doivent avoir mathématiquement la même valeur. Je n'étais pas convaincu samedi de toute façon, alors j'ai dormi, je me suis calmé, J'ai écrit une version japonaise cumulative dimanche et je l'ai soumise.

c_.py


n = int(input())
l = input()
a = l.split(' ')

tmp = 0
total2 = 0

for i in range(n):
    tmp += int(a[i])

for i in range(n):
    total2 += int(a[i])*(tmp-int(a[i]))
    tmp -= int(a[i])

print(total2%1000000007)

image.png

** Ouais ouais ouais ouais ouais ouais **

Pourquoi? Pourquoi faites-vous la même chose, l'un est WA et l'autre est AC? ?? ??

J'ai essayé diverses choses

Tout d'abord, j'ai vérifié la taille d'un nombre de type int pouvant être gérée par python. En conséquence, dans python ver3, vous pouvez utiliser autant de valeurs que la mémoire le permet. Alors, qu'est-ce qui est étrange est ÷ 2? Je suis sûr que quelque chose d'étrange se produit lorsque les chiffres sont élevés.

J'ai entré 10 nombres de taille appropriée et affiché le nombre avant de diviser par 2 et le nombre lors de la division par 2.

input_data1


10
1234567 2345678 3456789 4567890 5678901 6789012 7890123 8901234 9012345 1111111

2257615544087530
1128807772043765

Cela semble correct. Faisons un peu plus grand.

input_data2


10
12345678 23456789 34567890 45678901 56789012 67890123 78901234 89012345 90123456 11111111

225761590208477104
112880795104238560

En regardant la place du 1, il est 4 avant de diviser par 2, donc ce qui est divisé par 2 devrait être 2 ou 7. Pourtant 0. Donc, si vous divisez un grand nombre par 2, quelque chose d'étrange semble se produire.

Pourquoi ça ne casse pas à 2

Quand j'ai googlé "la division python est étrange", j'ai trouvé l'article suivant.

Le résultat d'un énorme calcul décimal flottant était étrange dans Python3, j'ai donc essayé de trouver la raison https://paiza.hatenablog.com/entry/2017/08/01/Python3%E3%81%A7%E5%B7%A8%E5%A4%A7%E3%81%AA%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E8%A8%88%E7%AE%97%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%8C%E5%A4%89%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%A7%E7%90%86

Eh bien, je comprends ... mais je ne comprends toujours pas. .. .. Cependant, les grands nombres signifient que des choses étranges peuvent se produire lorsque vous les divisez. Je suis devenu plus intelligent. Merci beaucoup.

... Ah, regrettable.

Recommended Posts

AtCoder Beginner Contest 177 Problème C J'ai essayé de découvrir pourquoi c'était faux
AtCoder Beginner Contest # 002 Problème C
AtCoder Beginner Contest 174 C Problème (Python)
Quand j'ai essayé le concours AtCoder pour débutants, c'était un résultat terrible, alors je regarde en arrière
[Entraînement compétitif] J'ai essayé AtCoder Beginner Contest 171
AtCoder Beginner Contest 176 Explication de l '«étape» du problème C (Python3, C ++, Java)
Un débutant a essayé de colorier un dessin au trait avec un chainer. J'ai pu le faire.
AtCoder Regular Contest # 002 Problème C
AtCoder Beginner Contest 166 A Explication du problème "A? C" (Python3, C ++, Java)
J'ai essayé de découvrir les grandes lignes de Big Gorilla
AtCoder Beginner Contest 174 B Explication du problème "Distance" (C ++, Python, Java)
AtCoder Beginner Contest 177 B Explication du problème "Sous-chaîne" (Python3, C ++, Java)
[Pratique compétitive] J'ai essayé le concours AtCoder Beginner Contest 175 (A ~ C)
AtCoder Beginner Contest 167 Explication d'un problème "enregistrement" (Python3, C ++, Java)
AtCoder Beginner Contest 169 B Problème Explication "Multiplication 2" (Python3, C ++, Java)
AtCoder Beginner Contest 170 Un problème Explication des «cinq variables» (C ++, Python, Java)
AtCoder Beginner Contest 169 Explication du problème "Multiplication 1" (Python3, C ++, Java)
AtCoder Beginner Contest 176 A Explication du problème "Takoyaki" (Python3, C ++, Java)
AtCoder Beginner Contest 175 B Explication du problème "Making Triangle" (C ++, Python3, Java)
J'ai essayé de savoir si ReDoS est possible avec Python
AtCoder Beginner Contest 175 Explication d'un problème "Saison des pluies" (C ++, Python3, Java)
AtCoder Beginner Contest 176 B Problème Explication "Multiple of 9" (Python3, C ++, Java)
les débutants en python ont essayé de le découvrir
AtCoder Beginner Contest 174 Explication d'un problème "Climatiseur" (C ++, Python, Java)
AtCoder Beginner Contest 177 Explication du problème "Ne soyez pas en retard" (Python3, C ++, Java)
AtCoder Beginner Contest 173 B Problème Explication du "Récapitulatif de l'état du juge" (Python3, C ++, Java)
Lorsque j'ai essayé d'exécuter Python, j'ai été ignoré dans le Microsoft Store
AtCoder Beginner Contest 170 B Problème Explication "Crane and Turtle" (Python3, C ++, Java)
AtCoder Beginner Contest 177 Explication du problème C "Somme des produits de paires" (Python3, C ++, Java)
J'ai essayé de savoir ce que je pouvais faire car le tranchage est pratique
AtCoder Beginner Contest 165 Un problème Explication "We Love Golf" (Python3, C ++, Java)
AtCoder Beginner Contest 167 B Problème Explication de "Programmation linéaire facile" (Python3, C ++, Java)
Atcoder Beginner Contest A, B Résumé d'entrée qui a tendance à être un problème Python
Un débutant en programmation a essayé de vérifier le temps d'exécution du tri, etc.
AtCoder AGC 041 C - J'étais accro à la recherche complète de Domino Quality
[Je suis un débutant en informatique] J'ai fait de mon mieux pour implémenter Linux sur Windows
[Introduction à json] Non, j'en étais accro. .. .. ♬
J'ai essayé de trouver le rapport de circonférence par 100 millions de chiffres
J'ai essayé de mettre en œuvre le problème du voyageur de commerce
J'ai étudié comment rationaliser le flux de travail avec Excel x Python ②
J'ai étudié comment rationaliser le flux de travail avec Excel x Python ④
J'ai essayé de faire sonner le téléphone lorsqu'il a été publié sur le poste IoT
J'ai essayé de savoir comment rationaliser le flux de travail avec Excel x Python ⑤
[Rails] v1.0 est sorti sur google-cloud-vision de gem, j'ai donc essayé de le soutenir
J'ai étudié comment rationaliser le flux de travail avec Excel x Python ①
J'ai essayé de savoir ce qui se passerait si je convertissais NaN ou INF en int
Les débutants en Python ont créé un chat BOT alors j'ai essayé de résumer comment le faire
J'ai étudié comment rationaliser le flux de travail avec Excel x Python ③
Concours AtCoder Débutant 177
Concours AtCoder Débutant 172
Concours AtCoder Débutant 173
Concours Atcoder Débutant 153
AtCoder Beginner Contest 5 questions à remplir
Un codeur brun a tenté de résoudre le concours Panasonic 2020A ~ C
Le débutant de la CTF a tenté de créer un serveur problématique (Web) [Problème]
J'ai essayé de résoudre le problème avec Python Vol.1
Python: peut être répété en lambda
J'ai essayé de trouver la classe alternative avec tensorflow
Quand j'ai essayé d'installer PIL et matplotlib dans un environnement virtualenv, j'en étais accro.
Depuis qu'il y avait Doppelgenger, j'ai essayé de le distinguer avec l'intelligence artificielle (rires) (Partie 2)
Depuis qu'il y avait Doppelgenger, j'ai essayé de le distinguer avec l'intelligence artificielle (rires) (Partie 1)