#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif
#define int long long
#define all(x) x.begin(), x.end()
const int mod = 1000000007;
int32_t main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
map<pair<int, int>, set<pair<int, int>>> mp;
vector<int> d(n+1), x(n+1);
for (int i = 1; i <= n; i++) {
cin >> d[i] >> x[i];
if (d[i] > n) continue;
int dest = i + x[i] * d[i];
if (dest > n) dest = n - (n % d[i]);
mp[{d[i], i % d[i]}].insert({i, dest});
}
vector<int> adj[n+1];
for (auto& [pr, st] : mp) {
auto [gap, md] = pr;
vector<int> diff(n/gap + 5, 0);
auto conv = [&] (int x) {
return (x - md) / gap + 1;
};
auto rec = [&] (int x) {
return (x - 1) * gap + md;
};
for (auto& [start, dest] : st) {
diff[conv(start)]++;
diff[conv(dest) + 1]--;
}
for (int i = 2; i <= n / gap + 3; i++) {
diff[i] += diff[i-1];
if (diff[i]) {
int cur = rec(i);
adj[cur].push_back(cur - gap);
}
}
}
vector<int> dp(n+1, 0);
dp[1] = 1;
int ans = 1;
for (int i = 2; i <= n; i++) {
for (auto& prv : adj[i]) dp[i] = dp[i] + dp[prv] % mod;
ans = ans + dp[i] % mod;
}
cout << ans << '\n';
}
# | 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... |