题目描述
给定 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,表示所求的和。请使用合适的数据类型进行运算。
样例输入
复制
4 1 3 6 9
样例输出
复制
117
提示
对于 30% 的数据,1 ≤ n ≤ 1000,1 ≤ ai ≤ 100。
对于所有评测用例,1 ≤ n ≤ 200000,1 ≤ ai ≤ 1000。
解题思路
对于很多人来说,看到题目后的想法就是暴力破解,
ans=a1*a2+a1*a3+.....+a1*an+a2*a3+a2*a4+...a2*an+..+an-1*an,做个双重循环,然后O(n*n)的时间复杂度,拿不到满分。
其实这题主要还是考前缀和,可以看到ans==,后面aj的和=sum(数组的和)-a[i],复杂度为O(1),再与ai做乘法,复杂度为O(n)。
#include<bits/stdc++.h>
using namespace std;
//前缀和
int main()
{
int n;
cin>>n;
long long a[n];
int i;
long long sum=0; //求数组的和
for(i=0;i<n;i++){
cin>>a[i];
sum+=a[i];
}
long long ans=0;
for(i=0;i<n;i++)
{
ans+=a[i]*(sum-a[i]);
sum-=a[i];
}
cout<<ans;
}