Submission #1268121

#TimeUsernameProblemLanguageResultExecution timeMemory
1268121nguyenkhangxTrains (BOI24_trains)C++20
16 / 100
212 ms126132 KiB
#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
const int MOD = 1000000007;

int addmod(int a, int b){ a += b; if(a >= MOD) a -= MOD; return a; }
int submod(int a, int b){ a -= b; if(a < 0) a += MOD; return a; }

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int N;
    if(!(cin >> N)) return 0;
    vector<int> d(N+2), x(N+2);
    for(int i=1;i<=N;i++){
        cin >> d[i] >> x[i];
    }

    int B = max(1, (int)sqrt(N)); // ngưỡng
    // g[d] size N+ B + 5 để an toàn khi truy xuất i + k*d ngoài N
    vector<vector<int>> g(B+1, vector<int>(N + B + 5, 0));
    vector<int> dp(N+2, 0);

    for(int i = N; i >= 1; --i){
        if(d[i] == 0){
            dp[i] = 1;
        } else if(d[i] <= B){
            // dùng g[d]
            int start = i + d[i];
            if(start > N){
                dp[i] = 1;
            } else {
                int endPos = i + d[i] * (x[i] + 1); // vị trí sau phần tử cần trừ
                if(endPos > N + B) endPos = N + B + 1; // an toàn
                int sumSeg = submod(g[d[i]][start], (endPos <= N + B ? g[d[i]][endPos] : 0));
                dp[i] = addmod(1, sumSeg);
            }
        } else {
            // d[i] > B, số phần tử <= N / d[i] <= N / (B+1) ~ B -> duyệt trực tiếp
            int64 s = 0;
            for(int k = 1; k <= x[i]; ++k){
                int pos = i + k * d[i];
                if(pos > N) break;
                s += dp[pos];
                if(s >= MOD) s -= MOD;
            }
            dp[i] = (1 + (int)s) % MOD;
        }

        // cập nhật g for all small d
        for(int small = 1; small <= B; ++small){
            int idx = i;
            int nxt = i + small;
            int val = dp[i];
            int accum = 0;
            if(nxt <= N + B) accum = g[small][nxt];
            g[small][idx] = addmod(val, accum);
        }
    }

    cout << dp[1] % 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...