给出一个长度为 n 的数组 a[],请计算所有的(ai−aj)2的和,其中 i>j。写成公式为:\sum_{i=2}^n$$\sum_{j=1}^{i-1}$$(a_i-a_j)^2(1≤j<i≤n)。
输入的第一行有一个数 n(2≤n≤3×105),表示有 n 个数。
第二行有 n 个数 a1,a2,⋯,an(∣ai∣≤200)两数之间用空格分开。
一行一个数,表示答案。
3
2 8 4
56
5
-5 8 9 -4 -3
950
#include<bits/stdc++.h>
using namespace std;
const int maxN=3e5+9;
int n,d[409];
long long ans;
int read(){
int s=0,f=1;
char ch=getchar();
while (!isdigit(ch)){
if (ch=='-') f=-1;
ch=getchar();
}
while (isdigit(ch)){
s=(s<<3)+(s<<1)+(ch^48);
ch=getchar();
}
return s*f;
}
int main(){
n=read();
for (int i=1;i<=n;i++){
int x=read();
d[x+200]++;//记录该数出现的次数,消除后面重复运算
}
for (int i=-200;i<=200;i++){
if (!d[i+200]) continue;//如果这个数没有出现过则跳过
for (int j=-200;j<i;j++){
if (!d[j+200]) continue;//同上
ans+=d[i+200]*d[j+200]*(i-j)*(i-j);
}
}
cout<<ans<<endl;
return 0;
}