问题描述
给定 nn 个整数 a_1, a_2, · · · , a_na1,a2,⋅⋅⋅,an ,求它们两两相乘再相加的和,即:
S=a_{1} \cdot a_{2}+a_{1} \cdot a_{3}+\cdots+a_{1} \cdot a_{n}+a_{2} \cdot a_{3}+\cdots+a_{n-2} \cdot a_{n-1}+a_{n-2} \cdot a_{n}+a_{n-1} \cdot a_{n}S=a1⋅a2+a1⋅a3+⋯+a1⋅an+a2⋅a3+⋯+an−2⋅an−1+an−2⋅an+an−1⋅an
输入格式
输入的第一行包含一个整数 nn。
第二行包含 nn 个整数 a_1,a_2,\cdots, a_na1,a2,⋯,an。
输出格式
输出一个整数 SS,表示所求的和。请使用合适的数据类型进行运算。
样例输入
41 369
样例输出
117
评测用例规模与约定
对于 30 \%30% 的数据,1 \leq n \leq 1000,1 \leq a_{i} \leq 1001≤n≤1000,1≤ai≤100 。
对于所有评测用例, 1 \leq n \leq 200000,1 \leq a_{i} \leq 10001≤n≤200000,1≤ai≤1000 。
运行限制
最大运行时间:1s
最大运行内存: 512M
主要思想:乘法结合律和使用long long数据类型存储数据
#include<bits/stdc++.h>
using namespace std;
vector<long long> sums;
int main()
{
long long num;
vector<long long> a;
cin>>num;
int sum=0;
for(int i=0;i<num;i++)
{
long long b;
cin>>b;
a.push_back(b);
sums.push_back(sum);
sum+=b;
}
long long S=0;
for(int i=0;i<a.size();i++)
{
S+=a[i]*sums[i];
}
cout<<S;
return 0;
}