Submission #1164246

#TimeUsernameProblemLanguageResultExecution timeMemory
1164246ChottuFCryptography (NOI20_crypto)C++20
100 / 100
174 ms31704 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

vector<int> tree;
int cfr = 0;

int sum(int a, int b){
    a += cfr;
    b += cfr;
    int s = 0;
    while (a <= b){
        if (a%2 == 1){
            s += tree[a++];
        }
        if (b%2 == 0){
            s += tree[b--];
        }
        a /= 2;
        b /= 2;
    }
    return s;
}

void update(int k, int x){
    k += cfr;
    tree[k] = x;
    k /= 2;
    while (k >= 1){
        tree[k] = tree[2*k] + tree[2*k+1];
        k /= 2;
    }
}

const int MOD = 1e9+7;
const int MAXN = 1e6;

signed main() {
    int fac[MAXN];
    fac[0] = 1;
    for (int i = 1; i<MAXN; i++){
        fac[i] = fac[i-1]*i;
        fac[i] %= MOD;
    }
    int n;
    cin >> n;
    pair<int,int> arr[n];
    for (int i = 0; i<n; i++){
        int a;
        cin >> a;
        arr[i] = {a,i};
    }
    sort(arr,arr+n);
    vector<int> nw(n);
    for (int i = 0; i<n; i++){
        nw[arr[i].second] = cfr++;
    }
	cfr++;
    while (__builtin_popcount(cfr) != 1){
        cfr++;
    }
	cfr *= 2;
    tree.resize(2*cfr);
    for (int i = 0; i<cfr; i++){
        update(i,1); //set update
    }
    __int128 ans = 0;
    for (int i = 0; i<n; i++){
        int bef = sum(0,nw[i]-1);
        int ln = n-i-1;
        ans += bef*fac[ln];
        ans %= MOD; ans += MOD; ans %= MOD;
        update(nw[i],0);
    }
	int one = ans+1LL;
	one %= MOD;
    cout << one << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...