求助
  • 板块学术版
  • 楼主liufukang
  • 当前回复6
  • 已保存回复6
  • 发布时间2021/7/16 15:49
  • 上次更新2023/11/4 14:38:36
查看原帖
求助
139509
liufukang楼主2021/7/16 15:49

题目描述

给出一个长度为 nn 的数组 a[]a[],请计算所有的(aiaj)2(a_i-a_j)^2的和,其中 i>ji>j。写成公式为:\sum_{i=2}^n$$\sum_{j=1}^{i-1}$$(a_i-a_j)^21j<in1 \le j < i \le n)。

输入

输入的第一行有一个数 nn2n3×1052 \le n \le 3 \times 10^5),表示有 nn 个数。

第二行有 nn 个数 a1,a2,,ana_1,a_2,\cdots,a_nai200|a_i| \le 200)两数之间用空格分开。

输出

一行一个数,表示答案。

Input1

3
2 8 4

Output1

56

Input2

5
-5 8 9 -4 -3

Output2

950

CODE

#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;
}

感谢!

2021/7/16 15:49
加载中...