Problem:
Score : 300 points

Problem Statement

Given are N integers A_1,\ldots,A_N.

Find the sum of A_i \times A_j over all pairs (i,j) such that 1\leq i < j \leq N, modulo (10^9+7).

Constraints

2 \leq N \leq 2\times 10^5

0 \leq A_i \leq 10^9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 \ldots A_N

Output

Print \sum_{i=1}^{N-1}\sum_{j=i+1}^{N} A_i A_j, modulo (10^9+7).

Sample Input 1

3
1 2 3

Sample Output 1

11

We have 1 \times 2 + 1 \times 3 + 2 \times 3 = 11.

Sample Input 2

4
141421356 17320508 22360679 244949

Sample Output 2

437235829

Solution in OCaml (4.10.0) (judge verdict: Accepted)

open Printf
open Scanf

let prn s x = printf "%s %d\n" s x

let num () = scanf "%d" (fun x -> x)
let num1 () = scanf "%d\n" (fun x -> x)
let num2 () = scanf "%d %d\n" (fun x y -> (x, y))
let num3 () = scanf "%d %d %d\n" (fun x y z -> (x, y, z))

let numN n =
  let rec loop rs k =
    if k=n then
      List.rev rs
    else
      let x = scanf " %d" (fun x -> x) in
      loop (x::rs) (k+1)
  in
  if n=0 then
    []
  else if n=1 then
    [num ()]
  else
    loop [num ()] 1

let () =
  let m = 1000000007 in
  let n = num1 () in
  let xs = numN n in
  let s = List.fold_left
            (fun s x -> (s + x) mod m) 0 xs in
  let s2 = (s * s) mod m in
  let d =
    List.fold_left
      (fun s x -> (s + (x * x)) mod m)
      0 xs
  in
  let rec loop x =
    if x >= d && (x - d) mod 2 = 0 then x else loop (x+m)
  in
  let s2 = loop s2 in
  let r = ((s2 - d) / 2) mod m in
  printf "%d\n" r