题目链接
这题主要是推数学公式,然后进行计算就OK了,没想到的是竟然取模掉坑了,可能好久没做取模题了
解题思路:
- 这个题如果暴力的话n^2,肯定会超时的,所以最好是nlogn或n
- 所以我们之间将式子展开,结果展开后发现规律与式子
第一项 (n - 1)* a[0] * a[0] - 2 * a[0] * (a[1] + a[2] + ....a[n])
第二项 (n - 1)* a[1] * a[1] - 2 * a[1] * (a[2] + a[3] + ....a[n])
- 所以我们可以看出,前面为(n - 1) * a[i] *a[i]
- 后一项 2 * a[i] * (a[i + 1] + a[i + 2] + …a[n])
- 注意取模,如果不行就分步来做
需要注意的是:
- 记住如果有负数,那么我们还需要 + mod ) % mod
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 500010;
const int mod = 1e9+7;
long long a[N];
int main(){
int n;
scanf("%d",&n);
long long res = 0;
for (int i = 0; i < n; i ++){
scanf("%lld",&a[i]);
res += a[i];
}
long long ans = 0;
// res sum
long long sum = 0;
for (int i = 0; i < n; i++){
sum += a[i];
//ans = ((ans % mod + ((((n - 1) * a[i] % mod) % mod * a[i])%mod)) % mod - (((2 * a[i]) %mod) * ((res - sum)%mod)%mod)%mod)%mod;
long long x = (n - 1) * a[i] % mod * a[i] % mod;
long long y = 2 * a[i] %mod *((res - sum) % mod) % mod;
long long z = (x - y + ans + mod)% mod;
ans = z;
}
printf("%lld\n",ans);
}