题目描述
牛牛国有 n个城市,编号为 1-n,第 i个城市有一个价值 ai,牛国的国王牛阔落特别喜欢在牛牛国旅游,并且他不想每次旅游的时候都计算一遍走哪条路最短,于是他决定在任意两个城市之间建立一条双向道路,在第 ii 座城市和第 jj 座城市之间建立双向道路的代价是 (ai-aj)*(ai−aj) ,牛阔落希望你能算出这项工程的花费。由于答案太大,你只需要输出答案模 1e9+7 的余数
输入描述:
第一行一个整数 nn,表示城市的数量。
第二行 nn 以空格分隔的整数 a1,a2,…,ana1,a2,…,an,表示第i座城市的价值。
输出描述:
输出一行一个数字,表示工程的花费模 1e9+7 的余数
示例1
输入
3
1 2 3
输出
6
说明
城市1到城市2的道路价值是(2 - 1)^ 2 = 1
城市2到城市3的道路价值是(3 - 2)^ 2 = 1
城市1到城市3的道路价值是(3 - 1)^ 2 = 4
总的花费 = 1 + 1 + 4 = 6
思路:
(a[i] - a[x]) * (a[i] - a[x]) = a[i] * a[i] - 2 * a[i]* a[x] + a[x] * a[x]
所以里面一共就有(n - 1)个a[i]的平方,中间这部分减法就是2 * (sum - a[i]) * a[i], sum即是所有数字的和。然后举个简单例子就能发现最后的答案为n倍的平方和-和的平方
a b c
(a-b)(a-b)+(a-c)(a-c)+(b-c)(b-c)
2aa+2bb+2cc-(ab+ac)-(ab+bc)-(ac+bc)
=2aa+2bb+2cc-(sum-a)a-(sum-b)b-(sum-c)c
=2aa+2bb+2cc-(a+b+c)sum+aa+bb+cc
=3(aa+bb+cc)-sumsum
同时注意
保证取模后的结果为正数:
((x % MOD) + MOD) % MOD
AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e6+100;
const int mod=1e9+7;
ll ans=0,sum=0,x;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
ans=(ans+x*x)%mod;
sum=(sum+x)%mod;
}
ll res=(n*ans%mod-sum*sum%mod+mod)%mod;
cout<<res<<endl;
system("pause");
return 0;
}