问题描述
给定 n个整数 a1,a2,⋯,an
, 求它们两两相乘再相加的和,即
S=a1⋅a2+a1⋅a3+⋯+a1⋅an+a2⋅a3+⋯+an−2⋅an−1+an−2⋅an+an−1⋅an
格式输入
第一行 n
第二行 元素
格式输出
结果
样例输入
4
1 3 6 9
样例输出
117
评测用例规模与约定
对于 30%的数据, 1≤n≤1000,1≤ai≤100 。
对于所有评测用例, 1≤n≤2×105,1≤ai≤1000 。
解析
S=a1⋅a2+a1⋅a3+⋯+a1⋅an+a2⋅a3+⋯+an−2⋅an−1+an−2⋅an+an−1⋅an
将a_{1} 一直到 a_{n} 提出来,先相加再进行相乘,相加的部分直接使用前缀和即可
S=a1⋅(a2+a3+…+an)+a2⋅(a3+…+an)+…+an−1⋅an
参考程序
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 2e5 + 10;
typedef long long LL;
LL s[N],a[N];
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n ; i ++)
{
cin >> a[i];
s[i] = s[i - 1] + a[i];
}
LL res = 0;
for(int i = 1; i < n ; i ++) res += a[i] * (s[n] - s[i]);
printf("%lld",res);
return 0;
}
难度星级
⭐️⭐️知道前缀和就能都过
以个人刷题整理为目的,如若侵权,请联系删除~