#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
using ll = long long;
ll gcd(ll a, ll b)
{
return b ? gcd(b, a % b) : a;
}
ll mod = 1e9 + 7;
vector<ll> seg;
void update(ll l, ll r, ll lx, ll rx, ll u, ll x) {
if (lx >= l && rx <= r) {
seg[u] += x;
seg[u] %= mod;
return;
}
if (lx > r || rx < l) return;
ll m = (lx + rx) / 2;
update(l, r, lx, m, 2 * u + 1, x);
update(l, r, m + 1, rx, 2 * u + 2, x);
}
long long get(ll l, ll r, ll u, ll i) {
if (l == r) return (seg[u] % mod);
ll m = (l + r) / 2;
if (i <= m) return (seg[u] + get(l, m, 2 * u + 1, i)) % mod;
else return (seg[u] + get(m + 1, r, 2 * u + 2, i)) % mod;
}
void solve() {
ll n; cin >> n;
vector<vector<ll>>gp(n);
vector<ll>d(n),x(n);
ll f = 0;
for (ll i = 0; i < n; i++) {
cin >> d[i] >> x[i];
if (d[i] != 1)f = 1;
if (d[i] == 0)continue;
for (ll j = 1; j <= x[i]; j++) {
if (i + j * d[i] < n) {
gp[i].push_back(i + j * d[i]);
}
else break;
}
}
if (f == 0) {
ll ans = 0;
ll s = 1;
while (s < n)s <<= 1ll;
seg = vector<ll>(2 * s - 1);
update(0, 0, 0, s - 1, 0, 1);
for (ll i = 0; i < n; i++) {
ll nger = get(0, s - 1, 0, 0) % mod;
ans += nger;
ans %= mod;
update(i + 1, min(n - 1, i + x[i]) , 0, s - 1, 0, nger);
}
cout << ans << endl;
}
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
//signed _; cin >> _; while (_--)
solve();
}
# | 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... |