问题描述
给定 n 个整数 a1,a2,⋅⋅⋅,an ,求它们两两相乘再相加的和,即:
S=a1⋅a2+a1⋅a3+⋯+a1⋅an+a2⋅a3+⋯+an−2⋅an−1+an−2⋅an+an−1⋅an
输入格式
输入的第一行包含一个整数 n。
第二行包含 n 个整数 1,2,⋯,a1,a2,⋯,an。
输出格式
输出一个整数 S,表示所求的和。请使用合适的数据类型进行运算。
样例输入
41 369
样例输出
117
评测用例规模与约定
对于 30%30% 的数据,1≤n≤1000,1≤ai≤100 。
对于所有评测用例, 1≤n≤200000,1≤ai≤1000 。
运行限制
最大运行时间:1s
最大运行内存: 512M
思路:
//假如有5个数:a0,a1,a2,a3,a4
//求解:
// sum0 = a0 + a1 + a2 + a3 + a4
// 用乘法分配律进行分组求和
// sum1 = ( a1 + a2 + a3 + a4 ) * a0 = (sum0 - a0 ) * a0
// sum2 = ( a2 + a3 + a4 ) * a1 = (sum0 - a0 - a1 ) * a1
// sum3 = ( a3 + a4 ) * a2 = (sum0 - a0 - a1 - a2 ) * a2
// sum4 = ( a4 ) * a3 = (sum0 - a0 - a1 - a2 - a3 ) * a3
// res = sum1 + sum2 + sum3 + sum4
代码:
暴力(只有百分之60的分):
import java.util.Scanner;
public class 求和 {
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 < arr.length; i++) {
arr[i] = scanner.nextInt();
}
long sum = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = i + 1; j < arr.length; j++) {
long temp = arr[i] * arr[j];
sum += temp;
}
}
System.out.println(sum);
}
}
差分数组(只有百分之90的分):
import java.util.Scanner;
public class 求和 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr= new int[n];
long sum = 0l;
for (int i = 0; i < arr.length; i++) {
arr[i] = scanner.nextInt();
sum += arr[i];
}
long res = 0l;
for (int i = 0; i < arr.length; i++) {
sum = sum - arr[i];
res += sum * arr[i];
}
System.out.println(res);
}
}
前缀和(AC代码):
import java.util.Scanner;
public class 求和 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr= new int[n];
int[] copy = new int[n];
int sum = 0;
for (int i = 0; i < arr.length; i++) {
arr[i] = scanner.nextInt();
sum += arr[i];
copy[i] = sum;
}
long sum2 = 0l;
long a = 0l;
for (int i = 0; i < arr.length - 1; i++) {
a = arr[i] * (sum - copy[i]);
sum2 += a;
}
System.out.println(sum2);
}
}
利用数学完全平方公式(AC代码):
公式:
import java.util.Scanner;
public class 求和 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr= new int[n];
long sum = 0l;
for (int i = 0; i < arr.length; i++) {
arr[i] = scanner.nextInt();
sum += arr[i];
}
long res = sum * sum;
for (int i = 0; i < arr.length; i++) {
res -= arr[i] * arr[i];
}
System.out.println(res/2);
}
}