제출 #1000877

#제출 시각아이디문제언어결과실행 시간메모리
1000877SzilTrains (BOI24_trains)C++17
100 / 100
201 ms315816 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int MAXN = 100'001;
const int K = 400;
const ll MOD = 1e9+7;

ll dp[MAXN];
ll cnt[MAXN][K];
ll d[MAXN], x[MAXN];

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int n; cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> d[i] >> x[i];
    }
    for (int i = n; i >= 1; i--) {
        if (d[i] >= K) {
            dp[i] = 1;
            for (ll j = i+d[i]; d[i] != 0 && j <= n && j <= i+d[i]*x[i]; j+=d[i]) {
                dp[i] += dp[j];
                dp[i] %= MOD;
            }
            dp[i] %= MOD;
        } else {
            dp[i] = 1;
            if (d[i] != 0) {
                if (i + d[i] <= n) dp[i] += cnt[i + d[i]][d[i]];
                if (i + d[i] * (x[i] + 1) <= n) dp[i] -= cnt[i + d[i] * (x[i] + 1)][d[i]];
                dp[i] %= MOD;
            }
        }
        for (int j = 1; j < K; j++) {
            cnt[i][j] = dp[i];
            if (i + j <= n) cnt[i][j] += cnt[i+j][j];
            cnt[i][j] %= MOD;
        }
    }

    cout << (dp[1] + MOD) % MOD << "\n";
    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...