题目描述
给定n个整数a[1],a[2],...,a[n],求两两相乘再相加的和,即
S=a[1]·a[2]+a[1]·a[3]+...+a[1]·a[n]+a[2]·a[3]+...+a[2]·a[n]+...+a[n-1]·a[n]
输入格式
第一行为正整数n,第二行为n个整数。
30%的数据:2≤n≤1000,1≤a[i]≤100。
100%的数据:2≤n≤200000,1≤a[i]≤1000。
输出格式
输出一个数字表示答案S。
输入样例
4
1 3 6 9
输出样例
117
解析:
暴力枚举超时。
提公因式,可以发现,总和为前n-1项,分别成其后面所有数的和,前缀和即可。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
long long n,a[N],sum[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum[i]=a[i]+sum[i-1];
}
long long res=0;
for(int i=1;i<n;i++){
res+=a[i]*(sum[n]-sum[i]);
}
cout<<res;
return 0;
}