蓝桥杯 2022 省赛 A 组 C 题
题目描述
给定 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 个整数 a1,a2,⋯an 。
输出格式
输出一个整数 S,表示所求的和。请使用合适的数据类型进行运算。
输入输出样例
输入 #1复制
4
1 3 6 9
输出 #1复制
117
说明/提示
对于 30 \%30% 的数据, 1001≤n≤1000,1≤ai≤100 。
对于所有评测用例, 1≤n≤2×10^5,1≤ai≤1000 。
暴力求解可以获得30%的分数:
#include<cstdio> #include<iostream> using namespace std; typedef long long LL; int main() { LL sum = 0; int n; cin >> n; int g[200020]; for (int i = 0; i < n; i++) { scanf("%d", &g[i]); } for (int i = 0; i < n; i++) { for (int j = 1 + i; j < n; j++) { sum += g[i] * g[j]; } } cout << sum << endl; return 0; }
使用前缀和和差分(不超时代码:
#include<cstdio> #include<iostream> using namespace std; typedef long long LL; int main() { LL sum = 0; int n; cin >> n; int g[200020]; LL s[200020] = { 0 }; for (int i = 1; i <= n; i++) { scanf("%d", &g[i]); s[i] = s[i - 1] + g[i]; } for (int i = 1; i <= n; i++) { sum += g[i] * (s[n] - s[i]); } cout << sum << endl; return 0; }