AtCoder Beginner Contest 177 Explication du problème C "Somme des produits de paires" (Python3, C ++, Java)

Remarque) L'exemple de réponse est uniquement Python3 </ b>. Pour C ++ et Java, il est recommandé de voir le code de «Toutes les soumissions» et de l'implémenter.

Salut à tous (qui après le concours Bonsoir!) C'est Rute!

AtCoder Beginner Contest 177 C Je vais commencer à expliquer le problème! Vous pouvez voir l'explication des problèmes A et C à partir des liens ci-dessous, veuillez donc vérifier! !!

Explication de chaque problème

Un problème Problème B Problème C
en préparation en préparation Cet article

Résumé du problème

Étant donné une suite de nombres composée de $ N $ entiers $ A_1, ... A_N $. Trouvez la somme de $ A_i × A_j $ pour toutes les paires $ (i, j) $ qui satisfont $ 1 \ leq i <j \ leq N $ avec $ mod (10 ^ 9 + 7) $.

URL du problème: https://atcoder.jp/contests/abc177/tasks/abc177_c

Contrainte

・ $ 2 \ leq N \ leq 2 × 10 ^ 5 $ ・ $ 0 \ leq A_i \ leq 10 ^ 9 $ ・ Toutes les entrées sont des entiers

Commentaire

De $ A_1, ... A_N $, la paire $ (i, j) $ est $ (N-1) + (N-2) + .... 1 $ paire, et $ \ frac {N (N (N) Vous pouvez voir qu'il y a -1)} {2} $ paires. Si vous pensez à ceux-ci de 1 $ et calculez, vous aurez besoin du montant de $ O (N ^ 2) $. En règle générale, le nombre de calculs qu'un ordinateur peut traiter par seconde est d'environ 10 ^ 8 $ (100 millions de fois), donc en raison de restrictions, ce montant de calcul dépassera le délai d'exécution </ b>.

Considérons maintenant le problème sous un angle différent.

Dans l'exemple d'entrée 1 et l'exemple de sortie 1, la réponse est 11 $,

À propos de la réponse

\sum_{i = 1}^{N-1} \sum_{j = i+1}^{N} A_i A_j

je le sais

Alors, tout d'abord, pensons à trouver $ \ sum_ {j = i + 1} ^ {N} A_j $.

La technique utilisée ici est appelée somme cumulée </ b> </ font>.

La somme cumulative consiste à trouver la somme du premier terme à un certain terme à l'avance et à créer une séquence de nombres pour elle.

À titre d'exemple de colonne numérique créée par somme cumulée, Étant donné la séquence $ B : ( B_1, B_2, ... B_N $), [0 , \sum_{i = 1}^{1} B_i , \sum_{i = 1}^{2} B_i , ... \sum_{i = 1}^{N} B_i ] Il y a quelque chose comme ça.

Pour plus de détails, consultez l'article de Kenchon-san sur la somme cumulée.

La somme cumulative que nous considérons cette fois est une suite de nombres d'une longueur de $ N-1 $. [\sum_{j = 2}^{N} A_j , \sum_{j = 3}^{N} A_j , ... \sum_{j = N}^{N} A_j] est. Cela peut être créé en continuant à soustraire $ A_ {j-1} $ de la somme de la séquence A et en continuant à insérer des valeurs dans la séquence à chaque fois.

Vous avez maintenant une séquence de $ \ sum_ {j = i + 1} ^ {N} A_j $. Appelons cette colonne numérique $ C $.

prochain,

\sum_{i = 1}^{N-1} \sum_{j = i+1}^{N} A_i A_j

Calculez $ A_i x C_i $ pour chaque $ i (1 \ leq i \ leq N-1) $ à trouver. Ajoutez cette valeur à la valeur de la réponse que vous recherchez.

Enfin, divisez la valeur de la réponse par $ (10 ^ 9 + 7) $ et affichez le reste.

Ici, dans le cas de Python, il n'est pas nécessaire de diviser la réponse par $ (10 ^ 9 + 7) $ à chaque fois car cela correspond à plusieurs entiers de longueur, mais dans le cas de C ++ et Java, c'est au milieu du calcul. La réponse peut être plus large que la plage de type entier 64 bits. </ b> (long, long long int, etc.) (soi-disant débordement </ b>)

C'est parce que $ 2 ^ {63} -1 \ simeq 9,22 × 10 ^ {18} $, mais en raison de la limitation de $ A_i $, il est possible que $ 10 ^ {18} $ puisse être ajouté plus de 10 $ fois. est.

Après tout, même si vous continuez à diviser la valeur par 10 $ ^ 9 + 7 $ à chaque fois après l'avoir ajoutée, ce sera la même chose à la fin, donc si vous continuez à la diviser par 10 $ ^ 9 + 7 $, débordement Vous n'avez pas à vous soucier de </ b>.

Le montant du calcul est $ O (N) $ dans le traitement de la somme cumulative, et il en coûte $ O (1) $ lors du calcul de $ A_i × C_i $ pour chaque $ i (1 \ leq i \ leq N-1) $. Cela devient $ O (N) $.

Ce qui suit est un exemple de réponse dans Pyhton3, C ++, Java. (À partir du 30/08 11:29, seul l'exemple de réponse de Python3 est affiché. C ++ et Java seront créés dès qu'ils seront prêts, veuillez donc attendre la mise à jour)

Exemple de solution en Python3

{ABC177C.py}


N = int(input()) #Entier à saisir
A = list(map(int,input().split())) #Chaîne numérique à saisir A
SUMA = sum(A) #Somme des nombres
MOD = 10**9 + 7 # mod
C = [0] * (N-1) #Colonne du nombre de somme cumulée
for i in range(N-1): #\sum_{j = i+1}^{N}Et assignez-le à une séquence de nombres
  SUMA -= A[i]
  C[i] = SUMA
ans = 0 #La réponse que vous cherchez
for i in range(N-1):
  ans += A[i]*C[i]
  ans %= MOD #Divisez par mod à chaque fois
print(ans) #Sortez la réponse

#Le montant du calcul est O(N)est.

Exemple de solution en C ++

en préparation

Exemple de réponse Java

en préparation

Recommended Posts