题目描述:
解题思路:
这道题需要数学推导加前缀和,比较不容易想到,一开始我写的暴力,很显然过不了。
首先这个式子可以想到乘法表,一个区间的和就类似于99乘法表。
这个可以推导出来,写出乘法表的式子,可以推导出来,就是把区间的所有数的平方都存起来,但是最后结果要减去对角线上的,因为那个是不需要的,在除于2就是结果,但是java比较麻烦,在取模的时候需要用到题目给的提示。
参考代码:
public int[] getSum(int[] a, int[] query) {
int mod = 1000000007;
int n = a.length;
long[] sum = new long[n + 1];
long[] sumSquare = new long[n + 1];
for (int i = 0; i < n; i++) {
sum[i + 1] = (sum[i] + a[i]) % mod;
sumSquare[i + 1] = (sumSquare[i] + (long) a[i] * a[i]) % mod;
}
int[] ans = new int[query.length / 2];
for (int i = 0; i < query.length; i += 2) {
int l = query[i], r = query[i + 1];
long tmp = (sum[r] - sum[l - 1] + mod) * (sum[r] - sum[l - 1] + mod);
tmp -= sumSquare[r] - sumSquare[l - 1];
tmp = (tmp % mod + mod) % mod;
tmp *= 500000004;
tmp %= mod;
ans[i / 2] = (int) tmp;
}
return ans;
}