Submission #1267197

#TimeUsernameProblemLanguageResultExecution timeMemory
1267197canhnam357Trains (BOI24_trains)C++20
100 / 100
203 ms45628 KiB
#include <bits/stdc++.h>
using namespace std;
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    vector<pair<int, int>> a;
    for (int i = 0; i < n; i++) {
        int d, x;
        cin >> d >> x;
        if (d > 0) {
            x = min(x, (n - 1 - i) / d);
        }
        a.emplace_back(d, x);
    }
    if (n == 1) {
        cout << 1;
        return 0;
    }
    if (!a[0].first) {
        cout << 1;
        return 0;
    }
    const int mod = 1e9 + 7;
    const int B = 320;
    vector<vector<int>> pre(n);
    for (int i = 0; i < n; i++) {
        auto [d, x] = a[i];
        if (!d || !x) continue;
        if (d >= B) {
            int p = i;
            while (p + d < n && x > 0) {
                x--;
                pre[p + d].push_back(i);
                p += d;
            }
        }
    }
    vector<int> dp(n);
    dp[0] = 1;
    vector<vector<int>> g(B, vector<int>(B));
    vector<vector<tuple<int, int, int>>> f(n);
    auto add = [&](int i, int d, int x) {
        if (!d || !x) return;
        g[d][i % d] += dp[i];
        if (g[d][i % d] >= mod) g[d][i % d] -= mod;
        if (i + d * (x + 1) < n) {
            f[i + d * (x + 1)].emplace_back(d, i % d, mod - dp[i]);
        }
    };
    if (a[0].first < B) add(0, a[0].first, a[0].second);
    for (int i = 1; i < n; i++) {
        for (auto [x, y, z] : f[i]) {
            g[x][y] += z;
            if (g[x][y] >= mod) g[x][y] -= mod;
        }
        for (int j : pre[i]) {
            dp[i] += dp[j];
            if (dp[i] >= mod) dp[i] -= mod;
        }
        for (int j = 1; j < B; j++) {
            dp[i] += g[j][i % j];
            if (dp[i] >= mod) dp[i] -= mod;
        }
        if (a[i].first < B) add(i, a[i].first, a[i].second);
    }
    int ans = 0;
    for (int i : dp) {
        ans += i;
        if (ans >= mod) ans -= mod;
    }
    cout << ans;
    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...