题目描述
给定 n 个整数 1,2,⋯ ,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,表示所求的和。请使用合适的数据类型进行运算。
输入输出样例
输入
4 1 3 6 9
输出 #1复制
117
说明/提示
对于 30%30% 的数据, 1≤n≤1000,1≤ai≤100 。
对于所有评测用例,1≤n≤2×105,1≤ai≤1000 。
蓝桥杯 2022 省赛 A 组 C 题。
思路
利用前缀和的知识,用sum维护一个前缀和数组
S=a1⋅a2+a1⋅a3+⋯+a1⋅an+a2⋅a3+⋯+an−2⋅an−1+an−2⋅an+an−1⋅an=(a2+a3+⋯+an)⋅a1+(a3+a4+⋯+an)⋅a2+⋯+an⋅an−1
由公式推导,最终只需要从1到n-1遍历一次a数组,将a[i] * (sum[n] - sum[i])的值累加到ans中即可
#define _for(i,a,b) for(int i=a;i<b;i++)
#define ll long long
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1000010;
ll s;
ll n;
ll a[N];
ll sum[N];
int main()
{
cin >> n;
_for(i, 1, n + 1) {
cin >> a[i];
sum[i] = sum[i - 1] + a[i];
}
_for(i, 1, n) {
s += a[i] * (sum[n] - sum[i]);
}
cout << s << endl;
return 0;
}