#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MOD = 1e9+7;
const int MAXN = 3e5+5;
int fact[MAXN];
struct BIT {
vector<int> bit;
int n;
BIT(int size) {
n = size + 2;
bit.assign(n, 0);
}
void add(int index, int val) {
for (; index < n; index += index & -index)
bit[index] += val;
}
int sum(int index) {
int res = 0;
for (; index > 0; index -= index & -index)
res += bit[index];
return res;
}
int query(int l, int r) {
return sum(r) - sum(l - 1);
}
};
void compute_factorials(int n) {
fact[0] = 1;
for (int i = 1; i <= n; ++i)
fact[i] = 1LL*fact[i-1]*i%MOD;
}
int32_t main() {
int n;
cin >> n;
vector<int> p(n);
for (int i = 0; i < n; ++i) cin >> p[i];
vector<int> sorted = p;
sort(sorted.begin(), sorted.end());
for (int i = 0; i < n; ++i) {
p[i] = lower_bound(sorted.begin(), sorted.end(), p[i])-sorted.begin()+1;
}
compute_factorials(n);
BIT bit(n);
int result = 1;
for (int i = 1; i <= n; ++i)
bit.add(i, 1);
for (int i = 0; i < n; ++i) {
int x = p[i];
int count_less = bit.sum(x - 1);
result = (result+count_less*fact[n-i-1])%MOD;
bit.add(x, -1);
}
cout << result;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |