Submission #1267197

#TimeUsernameProblemLanguageResultExecution timeMemory
1267197canhnam357Trains (BOI24_trains)C++20
100 / 100
203 ms45628 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...