牛客编程巅峰赛S2第四场:交叉乘

题目描述:

题目链接
在这里插入图片描述
在这里插入图片描述

解题思路:

这道题需要数学推导加前缀和,比较不容易想到,一开始我写的暴力,很显然过不了。
首先这个式子可以想到乘法表,一个区间的和就类似于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;
    }

猜你喜欢

转载自blog.csdn.net/qq_44900959/article/details/110282903