Submission #330583

#TimeUsernameProblemLanguageResultExecution timeMemory
330583jungsnowCryptography (NOI20_crypto)C++14
100 / 100
619 ms35180 KiB
#include<bits/stdc++.h>

using namespace std;

const int maxn = 300100, mod = 1e9 + 7;

int add(int a, int b) {
    a += b;
    if (a >= mod)
        a -= mod;
    return a;
}

int mul(int a, int b) {
    return 1ll * a * b % mod;
}

int N, A[maxn], fac[maxn];

template<typename T>
struct fenwick {
    T bit[maxn];
    fenwick() {
        fill(bit, bit + maxn, T(0));
    }
    void upd(int x, T val) {
        for (; x < maxn; x += x & -x)
            bit[x] += val;
    }
    T get(int x) {
        T res = 0;
        for (; x; x -= x & -x)
            res += bit[x];
        return res;
    }
};

fenwick<int> T1;

int main() {
//    freopen("cc.inp", "r", stdin);
//    freopen("cc.out", "w", stdout);
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> N;
    fac[0] = 1;
    set<int> s;
    map<int, int> mp;
    for (int i = 1; i <= N; ++i) {
        cin >> A[i];
        s.insert(A[i]);
        fac[i] = mul(fac[i - 1], i);
    }
    int cur = 0;
    for (auto it = s.begin(); it != s.end(); ++it) {
        mp[*it] = ++cur;
    }
    int Ans = 0;
    for (int i = N; i >= 1; --i) {
        A[i] = mp[A[i]];
        Ans = add(Ans, mul(T1.get(A[i] - 1), fac[N - i]));
        T1.upd(A[i], 1);
    }
    cout << add(Ans, 1);
    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...