1
0

AtCoder-agc023_e.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. constexpr long long MOD = 1'000'000'007LL;
  4. long long mod_power(long long base, long long exponent) {
  5. long long result = 1;
  6. while (exponent > 0) {
  7. if (exponent & 1) result = result * base % MOD;
  8. base = base * base % MOD;
  9. exponent >>= 1;
  10. }
  11. return result;
  12. }
  13. struct Fenwick {
  14. int n;
  15. vector<long long> tree;
  16. explicit Fenwick(int n) : n(n), tree(n + 1, 0) {}
  17. void add(int index, long long value) {
  18. value %= MOD;
  19. for (; index <= n; index += index & -index) {
  20. tree[index] += value;
  21. if (tree[index] >= MOD) tree[index] -= MOD;
  22. }
  23. }
  24. long long sum(int index) const {
  25. long long result = 0;
  26. for (; index > 0; index -= index & -index) result = (result + tree[index]) % MOD;
  27. return result;
  28. }
  29. long long range_sum(int left, int right) const {
  30. if (left > right) return 0;
  31. return (sum(right) - sum(left - 1) + MOD) % MOD;
  32. }
  33. };
  34. int main() {
  35. ios::sync_with_stdio(false);
  36. cin.tie(nullptr);
  37. int n;
  38. cin >> n;
  39. vector<int> a(n), frequency(n + 1, 0);
  40. for (int &x : a) {
  41. cin >> x;
  42. ++frequency[x];
  43. }
  44. vector<int> at_least(n + 2, 0), choices(n + 1, 0);
  45. for (int value = n; value >= 1; --value) {
  46. at_least[value] = at_least[value + 1] + frequency[value];
  47. choices[value] = at_least[value] - (n - value);
  48. if (choices[value] <= 0) {
  49. cout << 0 << '\n';
  50. return 0;
  51. }
  52. }
  53. long long permutations = 1;
  54. vector<long long> prefix(n + 1, 1), inverse_prefix(n + 1, 1);
  55. vector<int> zero_count(n + 1, 0);
  56. for (int value = 1; value <= n; ++value) {
  57. permutations = permutations * choices[value] % MOD;
  58. prefix[value] = prefix[value - 1];
  59. zero_count[value] = zero_count[value - 1];
  60. if (choices[value] == 1) {
  61. ++zero_count[value];
  62. } else {
  63. prefix[value] = prefix[value] * (choices[value] - 1) % MOD;
  64. prefix[value] = prefix[value] * mod_power(choices[value], MOD - 2) % MOD;
  65. }
  66. inverse_prefix[value] = mod_power(prefix[value], MOD - 2);
  67. }
  68. vector<int> group_left(n + 1), group_right(n + 1);
  69. for (int left = 1; left <= n;) {
  70. int right = left;
  71. while (right + 1 <= n && zero_count[right + 1] == zero_count[left]) ++right;
  72. for (int value = left; value <= right; ++value) {
  73. group_left[value] = left;
  74. group_right[value] = right;
  75. }
  76. left = right + 1;
  77. }
  78. Fenwick counts(n), sum_prefix(n), sum_inverse(n);
  79. const long long inverse_two = (MOD + 1) / 2;
  80. long long normalized = 0;
  81. long long inversions_of_a = 0;
  82. int inserted = 0;
  83. for (int value : a) {
  84. long long greater = inserted - counts.sum(value);
  85. inversions_of_a = (inversions_of_a + greater) % MOD;
  86. long long lower_inverse = sum_inverse.range_sum(group_left[value], value);
  87. normalized = (normalized + prefix[value] * lower_inverse) % MOD;
  88. long long higher_prefix = sum_prefix.range_sum(value + 1, group_right[value]);
  89. normalized = (normalized - inverse_prefix[value] * higher_prefix) % MOD;
  90. if (normalized < 0) normalized += MOD;
  91. counts.add(value, 1);
  92. sum_prefix.add(value, prefix[value]);
  93. sum_inverse.add(value, inverse_prefix[value]);
  94. ++inserted;
  95. }
  96. long long answer = permutations * inversions_of_a % MOD;
  97. answer = (answer + permutations * inverse_two % MOD * normalized) % MOD;
  98. cout << answer << '\n';
  99. return 0;
  100. }