数组的极差和 -- 阅读理解和取模运算

#include<bits/stdc++.h>


using namespace std;


const int MOD = 7 + 1e9;


const int MAXN = 1e5;
int N;


long long A[MAXN+10];


int main(){
    cin >> N;


    for(int i = 1; i<=N;i++){
        cin >> A[i];
    }
    // 由于B为排序数组,取极差的必为区间的首尾元素


    // 暴力求解 n * n


    //long long result = 0;
    //for(int i = 1; i < N;i++){
    //    for(int j = i + 1; j <= N; j++){
    //        result += (j - i) *  ((A[i]) * (A[j]))%MOD ;
    //        result = result % MOD;
    //    }
    //}


    //  暴力解法的第二个循环可以合并


    // 逆序累加和
    long long reCDF_jA[N+1];
    long long reCDF_A[N+1]; 


    reCDF_jA[N] = (N * A[N]) %MOD;
    reCDF_A[N] = A[N];


    for(int j = N-1 ; j>=1; j--){
        reCDF_jA[j] = (j*A[j] + reCDF_jA[j+1])%MOD;
        reCDF_A[j] = (A[j] + reCDF_A[j+1])%MOD;
    }


    long long result = 0;


    for(int i = 1; i < N ;i++){


        long long temp = ((reCDF_jA[i+1] - i * reCDF_A[i+1])%MOD + MOD)%MOD;
        result += (temp * A[i])%MOD;
        // 取模减法  
        result = result % MOD;
    }
    cout << result << endl;
    return 0;
}
相关面经
全部面经
招聘动态
更多动态