#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for (int i = (a), _b = (b); i <= (_b); ++i)
#define FORD(i,a,b) for (int i = (a), _b = (b); i >= (_b); --i)
#define REP(i, n) for (int i = (0), _n = (n); i < _n; ++i)
#define getBit(mask,i) (((mask) >> (i)) & (1LL))
#define MASK(x) (1LL << (x))
#define allof(x) begin(x), end(x)
#define el cout << '\n';
//--Compare------------------------------------------------------------------------------------
template<class X, class Y>
inline bool maximize(X &x, const Y &y){ return (x < y) ? x = y, 1 : 0; }
template<class X, class Y>
inline bool minimize(X &x, const Y &y){ return (x > y) ? x = y, 1 : 0; }
//--Process------------------------------------------------------------------------------------
#define int long long
constexpr int MAXN = 2e5 + 10, MOD = 1e9 + 7;
inline void add(int &x, const int &y) { x += y; if (x >= MOD) x -= MOD; }
inline int mul(const int &x, const int &y) { return 1LL * (x % MOD) * (y % MOD) % MOD; }
int n;
int d[MAXN], x[MAXN];
namespace subtask1
{
int dp[MAXN];
void solve(void)
{
// if (!(n <= 10000)) return;
dp[1] = 1;
int res = 0;
FOR(i, 1, n)
{
if (d[i])
FOR(j, 1, x[i])
{
int t = i + j * d[i];
if (t > n) break;
add(dp[t], dp[i]);
}
add(res, dp[i]);
}
cout << res << '\n';
cerr << 1;
exit(0);
}
}
namespace subtask2
{
int BIT[2][MAXN];
void updatePoint(const bool &_, int id, const int &val)
{
if (id <= 0) return;
for (; id <= n; id += id & -id) add(BIT[_][id], val);
}
void update(const int &l, const int &r, int val)
{
if (l > n || r > n || l > r) return;
val = (val + MOD) % MOD;
updatePoint(0, l, val);
updatePoint(0, r + 1, MOD - val);
updatePoint(1, l, mul((l - 1 + MOD * MOD) % MOD, val));
updatePoint(1, r + 1, mul((MOD * MOD - r) % MOD, val));
}
inline int getPrefix(const bool &_, int id)
{
if (id <= 0) return 0;
int res = 0;
for (; id; id -= id & -id) add(res, BIT[_][id]);
return res;
}
inline int get(int l, int r)
{
int x = (l > 1) ? (mul(getPrefix(0, l - 1), l - 1) - getPrefix(1, l - 1) + MOD) % MOD : 0;
int y = (mul(getPrefix(0, r), r) - getPrefix(1, r) + MOD * MOD) % MOD;
return (y - x + MOD) % MOD;
}
void solve(void)
{
if (*max_element(d + 1, d + n + 1) > 1) return;
int res = 0;
update(1, 1, 1);
FOR(i, 1, n)
{
int cur = get(i, i);
if (d[i])
{
int L = i + 1, R = min(n, i + x[i]);
update(L, R, cur);
}
add(res, cur);
}
cout << res << '\n';
cerr << 2;
exit(0);
}
}
namespace subtask4
{
constexpr int BLOCK_SZ = 447;
int dp[MAXN];
int lz[BLOCK_SZ + 2][BLOCK_SZ + 2];
vector <int> off[MAXN], on[MAXN];
void solve(void)
{
dp[1] = 1;
FOR(i, 1, n)
{
while (on[i].size())
{
int x = on[i].back(); on[i].pop_back();
add(lz[x % d[x]][d[x]], dp[x]);
}
while (off[i].size())
{
int x = off[i].back(); off[i].pop_back();
add(lz[x % d[x]][d[x]], MOD - dp[x]);
}
if (d[i] <= BLOCK_SZ)
FOR(D, 1, BLOCK_SZ) add(dp[i], lz[i % D][D]);
if (d[i] > BLOCK_SZ)
{
int t = i;
FOR(j, 1, x[i])
{
t += d[i];
if (t > n) break;
// assert(t <= n);
add(dp[t], dp[i]);
}
}
else if (d[i])
{
int L = i + d[i], R = min(n, i + x[i] * d[i]);
//// cout << i << ": " << L << ' ' << R << '\n';
on[L].emplace_back(i);
off[R + 1].emplace_back(i);
}
}
int res = 0;
// FOR(i, 1, n) cout << dp[i] << ' ';el;
FOR(i, 1, n) add(res, dp[i]);
cout << res << '\n';
cerr << 4;
exit(0);
}
}
signed main(void)
{
cin.tie(nullptr)->sync_with_stdio(false);
// cin.exceptions(cin.failbit);
#define task "CUUHO"
if (fopen(task".INP", "r"))
{
freopen(task".INP", "r", stdin);
freopen(task".OUT", "w", stdout);
}
//--OpenFile-------------------------------------------------------------------------------
cin >> n;
FOR(i, 1, n) cin >> d[i] >> x[i];
// subtask2::solve();
// subtask1::solve();
// assert(0);
subtask4::solve();
cerr << (1.0 * clock() / CLOCKS_PER_SEC);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBGT1IoaSxhLGIpICAgICAgZm9yIChpbnQgaSA9IChhKSwgX2IgPSAoYik7IGkgPD0gKF9iKTsgKytpKQojZGVmaW5lIEZPUkQoaSxhLGIpICAgICBmb3IgKGludCBpID0gKGEpLCBfYiA9IChiKTsgaSA+PSAoX2IpOyAtLWkpCiNkZWZpbmUgUkVQKGksIG4pICAgICAgICBmb3IgKGludCBpID0gKDApLCBfbiA9IChuKTsgaSA8IF9uOyArK2kpCiNkZWZpbmUgZ2V0Qml0KG1hc2ssaSkgICgoKG1hc2spID4+IChpKSkgJiAoMUxMKSkKI2RlZmluZSBNQVNLKHgpICAgICAgICAgICAgKDFMTCA8PCAoeCkpCiNkZWZpbmUgYWxsb2YoeCkgICAgICAgIGJlZ2luKHgpLCBlbmQoeCkKI2RlZmluZSBlbCAgICAgICAgICAgICAgY291dCA8PCAnXG4nOwoKLy8tLUNvbXBhcmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdGVtcGxhdGU8Y2xhc3MgWCwgY2xhc3MgWT4KICAgIGlubGluZSBib29sIG1heGltaXplKFggJngsIGNvbnN0IFkgJnkpeyByZXR1cm4gKHggPCB5KSA/IHggPSB5LCAxIDogMDsgfQoKdGVtcGxhdGU8Y2xhc3MgWCwgY2xhc3MgWT4KICAgIGlubGluZSBib29sIG1pbmltaXplKFggJngsIGNvbnN0IFkgJnkpeyByZXR1cm4gKHggPiB5KSA/IHggPSB5LCAxIDogMDsgfQoKLy8tLVByb2Nlc3MtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNkZWZpbmUgaW50ICAgICAgICAgICAgIGxvbmcgbG9uZwoKY29uc3RleHByIGludCBNQVhOID0gMmU1ICsgMTAsIE1PRCA9IDFlOSArIDc7CgppbmxpbmUgdm9pZCBhZGQoaW50ICZ4LCBjb25zdCBpbnQgJnkpIHsgeCArPSB5OyBpZiAoeCA+PSBNT0QpIHggLT0gTU9EOyB9CmlubGluZSBpbnQgbXVsKGNvbnN0IGludCAmeCwgY29uc3QgaW50ICZ5KSB7IHJldHVybiAxTEwgKiAoeCAlIE1PRCkgKiAoeSAlIE1PRCkgJSBNT0Q7IH0KCmludCBuOwppbnQgZFtNQVhOXSwgeFtNQVhOXTsKCm5hbWVzcGFjZSBzdWJ0YXNrMQp7CiAgICBpbnQgZHBbTUFYTl07CgogICAgdm9pZCBzb2x2ZSh2b2lkKQogICAgewovLyAgICAgICAgaWYgKCEobiA8PSAxMDAwMCkpIHJldHVybjsKCiAgICAgICAgZHBbMV0gPSAxOwogICAgICAgIGludCByZXMgPSAwOwogICAgICAgIEZPUihpLCAxLCBuKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGRbaV0pCiAgICAgICAgICAgIEZPUihqLCAxLCB4W2ldKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgdCA9IGkgKyBqICogZFtpXTsKICAgICAgICAgICAgICAgIGlmICh0ID4gbikgYnJlYWs7CiAgICAgICAgICAgICAgICBhZGQoZHBbdF0sIGRwW2ldKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYWRkKHJlcywgZHBbaV0pOwogICAgICAgIH0KCiAgICAgICAgY291dCA8PCByZXMgPDwgJ1xuJzsKCiAgICAgICAgY2VyciA8PCAxOwogICAgICAgIGV4aXQoMCk7CiAgICB9Cn0KCm5hbWVzcGFjZSBzdWJ0YXNrMgp7CiAgICBpbnQgQklUWzJdW01BWE5dOwoKICAgIHZvaWQgdXBkYXRlUG9pbnQoY29uc3QgYm9vbCAmXywgaW50IGlkLCBjb25zdCBpbnQgJnZhbCkKICAgIHsKICAgICAgICBpZiAoaWQgPD0gMCkgcmV0dXJuOwogICAgICAgIGZvciAoOyBpZCA8PSBuOyBpZCArPSBpZCAmIC1pZCkgYWRkKEJJVFtfXVtpZF0sIHZhbCk7CiAgICB9CgogICAgdm9pZCB1cGRhdGUoY29uc3QgaW50ICZsLCBjb25zdCBpbnQgJnIsIGludCB2YWwpCiAgICB7CiAgICAgICAgaWYgKGwgPiBuIHx8IHIgPiBuIHx8IGwgPiByKSByZXR1cm47CgogICAgICAgIHZhbCA9ICh2YWwgKyBNT0QpICUgTU9EOwoKICAgICAgICB1cGRhdGVQb2ludCgwLCBsLCB2YWwpOwogICAgICAgIHVwZGF0ZVBvaW50KDAsIHIgKyAxLCBNT0QgLSB2YWwpOwogICAgICAgIHVwZGF0ZVBvaW50KDEsIGwsIG11bCgobCAtIDEgKyBNT0QgKiBNT0QpICUgTU9ELCB2YWwpKTsKICAgICAgICB1cGRhdGVQb2ludCgxLCByICsgMSwgbXVsKChNT0QgKiBNT0QgLSByKSAlIE1PRCwgdmFsKSk7CiAgICB9CgogICAgaW5saW5lIGludCBnZXRQcmVmaXgoY29uc3QgYm9vbCAmXywgaW50IGlkKQogICAgewogICAgICAgIGlmIChpZCA8PSAwKSByZXR1cm4gMDsKICAgICAgICBpbnQgcmVzID0gMDsKICAgICAgICBmb3IgKDsgaWQ7IGlkIC09IGlkICYgLWlkKSBhZGQocmVzLCBCSVRbX11baWRdKTsKICAgICAgICByZXR1cm4gcmVzOwogICAgfQoKICAgIGlubGluZSBpbnQgZ2V0KGludCBsLCBpbnQgcikKICAgIHsKICAgICAgICBpbnQgeCA9IChsID4gMSkgPyAobXVsKGdldFByZWZpeCgwLCBsIC0gMSksIGwgLSAxKSAtIGdldFByZWZpeCgxLCBsIC0gMSkgKyBNT0QpICUgTU9EIDogMDsKICAgICAgICBpbnQgeSA9IChtdWwoZ2V0UHJlZml4KDAsIHIpLCByKSAtIGdldFByZWZpeCgxLCByKSArIE1PRCAqIE1PRCkgJSBNT0Q7CgogICAgICAgIHJldHVybiAoeSAtIHggKyBNT0QpICUgTU9EOwogICAgfQoKICAgIHZvaWQgc29sdmUodm9pZCkKICAgIHsKICAgICAgICBpZiAoKm1heF9lbGVtZW50KGQgKyAxLCBkICsgbiArIDEpID4gMSkgcmV0dXJuOwoKICAgICAgICBpbnQgcmVzID0gMDsKICAgICAgICB1cGRhdGUoMSwgMSwgMSk7CgogICAgICAgIEZPUihpLCAxLCBuKQogICAgICAgIHsKICAgICAgICAgICAgaW50IGN1ciA9IGdldChpLCBpKTsKICAgICAgICAgICAgaWYgKGRbaV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCBMID0gaSArIDEsIFIgPSBtaW4obiwgaSArIHhbaV0pOwogICAgICAgICAgICAgICAgdXBkYXRlKEwsIFIsIGN1cik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFkZChyZXMsIGN1cik7CiAgICAgICAgfQoKICAgICAgICBjb3V0IDw8IHJlcyA8PCAnXG4nOwoKICAgICAgICBjZXJyIDw8IDI7CiAgICAgICAgZXhpdCgwKTsKICAgIH0KfQoKbmFtZXNwYWNlIHN1YnRhc2s0CnsKICAgIGNvbnN0ZXhwciBpbnQgQkxPQ0tfU1ogPSA0NDc7CiAgICBpbnQgZHBbTUFYTl07CiAgICBpbnQgbHpbQkxPQ0tfU1ogKyAyXVtCTE9DS19TWiArIDJdOwogICAgdmVjdG9yIDxpbnQ+IG9mZltNQVhOXSwgb25bTUFYTl07CgogICAgdm9pZCBzb2x2ZSh2b2lkKQogICAgewoKICAgICAgICBkcFsxXSA9IDE7CiAgICAgICAgRk9SKGksIDEsIG4pCiAgICAgICAgewogICAgICAgICAgICB3aGlsZSAob25baV0uc2l6ZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgeCA9IG9uW2ldLmJhY2soKTsgb25baV0ucG9wX2JhY2soKTsKICAgICAgICAgICAgICAgIGFkZChselt4ICUgZFt4XV1bZFt4XV0sIGRwW3hdKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2hpbGUgKG9mZltpXS5zaXplKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCB4ID0gb2ZmW2ldLmJhY2soKTsgb2ZmW2ldLnBvcF9iYWNrKCk7CiAgICAgICAgICAgICAgICBhZGQobHpbeCAlIGRbeF1dW2RbeF1dLCBNT0QgLSBkcFt4XSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkW2ldIDw9IEJMT0NLX1NaKQogICAgICAgICAgICAgICAgRk9SKEQsIDEsIEJMT0NLX1NaKSBhZGQoZHBbaV0sIGx6W2kgJSBEXVtEXSk7CgogICAgICAgICAgICBpZiAoZFtpXSA+IEJMT0NLX1NaKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgdCA9IGk7CiAgICAgICAgICAgICAgICBGT1IoaiwgMSwgeFtpXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0ICs9IGRbaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHQgPiBuKSBicmVhazsKLy8gICAgICAgICAgICAgICAgICAgIGFzc2VydCh0IDw9IG4pOwogICAgICAgICAgICAgICAgICAgIGFkZChkcFt0XSwgZHBbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRbaV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCBMID0gaSArIGRbaV0sIFIgPSBtaW4obiwgaSArIHhbaV0gKiBkW2ldKTsKLy8vLyAgICAgICAgICAgICAgICBjb3V0IDw8IGkgPDwgIjogIiA8PCBMIDw8ICcgJyA8PCBSIDw8ICdcbic7CiAgICAgICAgICAgICAgICBvbltMXS5lbXBsYWNlX2JhY2soaSk7CiAgICAgICAgICAgICAgICBvZmZbUiArIDFdLmVtcGxhY2VfYmFjayhpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaW50IHJlcyA9IDA7Ci8vICAgICAgICBGT1IoaSwgMSwgbikgY291dCA8PCBkcFtpXSA8PCAnICc7ZWw7CiAgICAgICAgRk9SKGksIDEsIG4pIGFkZChyZXMsIGRwW2ldKTsKICAgICAgICBjb3V0IDw8IHJlcyA8PCAnXG4nOwoKICAgICAgICBjZXJyIDw8IDQ7CiAgICAgICAgZXhpdCgwKTsKICAgIH0KfQoKc2lnbmVkIG1haW4odm9pZCkKewogICAgY2luLnRpZShudWxscHRyKS0+c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKLy8gICAgY2luLmV4Y2VwdGlvbnMoY2luLmZhaWxiaXQpOwoKICAgICNkZWZpbmUgdGFzayAiQ1VVSE8iCiAgICBpZiAoZm9wZW4odGFzayIuSU5QIiwgInIiKSkKICAgIHsKICAgICAgIGZyZW9wZW4odGFzayIuSU5QIiwgInIiLCBzdGRpbik7CiAgICAgICBmcmVvcGVuKHRhc2siLk9VVCIsICJ3Iiwgc3Rkb3V0KTsKICAgIH0KICAgIC8vLS1PcGVuRmlsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBjaW4gPj4gbjsKICAgIEZPUihpLCAxLCBuKSBjaW4gPj4gZFtpXSA+PiB4W2ldOwoKLy8gICAgc3VidGFzazI6OnNvbHZlKCk7Ci8vICAgIHN1YnRhc2sxOjpzb2x2ZSgpOwovLyAgICBhc3NlcnQoMCk7CiAgICBzdWJ0YXNrNDo6c29sdmUoKTsKCiAgICBjZXJyIDw8ICgxLjAgKiBjbG9jaygpIC8gQ0xPQ0tTX1BFUl9TRUMpOwogICAgcmV0dXJuIDA7Cn0K