제출 #1130573

#제출 시각아이디문제언어결과실행 시간메모리
1130573kirakosyanTrains (BOI24_trains)C++20
8 / 100
1049 ms1114112 KiB
#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; void solve() { ll n; cin >> n; vector<vector<ll>>gp(n); vector<ll>d(n),x(n); int 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; vector<ll>pref(n + 10); pref[0] = 1; pref[1] = -1; for (ll i = 0; i < n; i++) { if (i != 0)pref[i] += pref[i - 1]; pref[i] %= mod; pref[i + 1] += pref[i]; pref[min(n, i + x[i] + 1)] -= pref[i]; ans += pref[i]; ans %= mod; } cout << ans << endl; } else if (n <= 10000) { ll ans = 0; vector<ll>dp(n); dp[0] = 1; for (ll i = 0; i < n; i++) { if (dp[i] > mod) dp[i] -= mod; for (ll x : gp[i]) { dp[x] += dp[i]; if (dp[x] > mod)dp[x] -= mod; } ans += dp[i]; if (ans > mod)ans -= mod; } cout << ans << endl; } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); //signed _; cin >> _; while (_--) solve(); }
#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...