#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod = 1e9+7;
int n;
ll dd[100405], dura[100405];
ll dp[100405];
ll qs[100405][405];
int sq = 400;
int main() {
cin.tie(0) -> sync_with_stdio(0);
cin >> n;
for(int i=1;i<=n;i++) {
cin >> dd[i] >> dura[i];
}
for(int i=n;i>=1;i--) {
dp[i] = 1;
if(dd[i]) {
if(dd[i] >= sq) {
//calculate directly
for(int j=1, ci=i + dd[i];j<=dura[i] && ci <= n;j++, ci += dd[i]) {
dp[i] += dp[ci];
if(dp[i] >= mod) dp[i] -= mod;
}
} else {
dp[i] = dp[i] + (i+dd[i] > n ? 0 : qs[i+dd[i]][dd[i]]) - (i+dd[i]*(dura[i]+1) > n ? 0 : qs[i+dd[i]*(dura[i]+1)][dd[i]]);
while(dp[i] < 0) dp[i] += mod;
while(dp[i] >= mod) dp[i] -= mod;
}
}
for(int cd=1;cd<=sq;cd++) {
qs[i][cd] = qs[i+cd][cd] + dp[i];
if(qs[i][cd] >= mod) qs[i][cd] -= mod;
}
//cout << dp
}
cout << dp[1];
}
# | 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... |