1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| #include <bits/stdc++.h> using namespace std;
static const int MOD = 1'000'000'007; static const int MAXV = 10'000'019;
struct BIT { int n; vector<long long> cnt, sum;
BIT(int n = 0) : n(n), cnt(n + 1), sum(n + 1) {}
void add(int idx, long long c, long long s) { for (; idx <= n; idx += idx & -idx) { cnt[idx] = (cnt[idx] + c) % MOD; sum[idx] = (sum[idx] + s) % MOD; } }
pair<long long, long long> query(int idx) { long long c = 0, s = 0; for (; idx > 0; idx -= idx & -idx) { c = (c + cnt[idx]) % MOD; s = (s + sum[idx]) % MOD; } return {c, s}; } };
int main() { ios::sync_with_stdio(false); cin.tie(nullptr);
const int N = 1'000'000;
vector<int> a(N + 1); long long cur = 1; for (int i = 1; i <= N; ++i) { cur = cur * 153 % MAXV; a[i] = (int)cur; }
vector<int> vals(a.begin() + 1, a.end()); sort(vals.begin(), vals.end()); vals.erase(unique(vals.begin(), vals.end()), vals.end());
auto get_id = [&](int x) { return lower_bound(vals.begin(), vals.end(), x) - vals.begin() + 1; };
int M = vals.size();
BIT bit_cnt[5], bit_sum[5]; for (int i = 1; i <= 4; ++i) { bit_cnt[i] = BIT(M); bit_sum[i] = BIT(M); }
long long answer = 0;
for (int i = 1; i <= N; ++i) { int x = a[i]; int id = get_id(x);
for (int len = 4; len >= 2; --len) { auto [c, s] = bit_cnt[len - 1].query(id - 1); if (c == 0) continue;
long long new_sum = (s + c * x) % MOD; bit_cnt[len].add(id, c, new_sum);
if (len == 4) { answer = (answer + new_sum) % MOD; } }
bit_cnt[1].add(id, 1, x); }
cout << answer << '\n'; return 0; }
|