题目描述
给定 n 个整数 a1,a2,··,an,求它们两两相乘再相加的和,即
S= a1*a2 + a1*a3 +·..+ a1*an + a2*a3+·.·+ an-2*an-1+ an-2*an+ an-1*an
输入格式
输入的第一行包含一个整数n。
第二行包含几 个整数 a1, a2,···an 。
输出格式
输出一个整数 S,表示所求的和。请使用合适的数据类型进行运算。
输入输出样例
输入
4
1 3 6 9
输出
117
说明/提示
对于 30% 的数据, 1 ≤ n < 1000,1 ≤ ai < 100.
对于所有评测用例,1 < n < 2 x 10^5,1 < a < 1000
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n];
for(int i = 0;i < n;i++) {
arr[i] = scanner.nextInt();
}
long sum = 0;
long ans = 0;
for(int i = n - 2;i >= 0;i--) {
ans += arr[i + 1];
sum += ans*arr[i];
}
System.out.print(sum);
}
}
题目分析:S= a1*a2 + a1*a3 +·..+ a1*an + a2*a3+·.·+ an-2*an-1+ an-2*an+ an-1*an将有共同前缀的部分写到一起有S = a1*(a2+a3+…an) + a2*(a3+a4+…+an) + …+ an-1*an,因此解题的关键在于前缀和的计算,为了降低时间复杂度题解中采用从后往前计算前缀和,每次求和只需要加上新的元素即可。