#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |