(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
#include<bits/stdc++.h> using namespace std; long long a[500005]; int n; int mod=1e9+7; long long ans=0; int main() { scanf("%d",&n); long long sum=0; for(int i=0;i<n;i++) { scanf("%lld",&a[i]); sum=(sum+a[i])%mod;//sum为这n个数字的和 ans=(ans+a[i]*a[i]%mod)%mod;//ans为这n个数字的平方和 } ans=(n*ans%mod-sum*sum%mod+mod)%mod; //答案便是n倍的平方和-和的平方 printf("%lld\n",ans); }