#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 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... |