제출 #1241792

#제출 시각아이디문제언어결과실행 시간메모리
1241792minhpkTrains (BOI24_trains)C++20
100 / 100
152 ms9428 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int a;
    cin >> a;
    int blk = 320;

    vector<vector<int>> val(blk+5, vector<int>(blk+5));
    vector<vector<pair<int, pair<int,int>>>> pos(a+5);
    vector<int> dp(a+5);
    vector<pair<int,int>> z(a+5);
    int MOD = 1000000007;

    dp[1] = 1;
    for(int i = 1; i <= a; i++){
        int x, y;
        cin >> x >> y;
        z[i] = {x, y};
        if(x < blk && x!=0){
            int end = min(i + x * y + 1, a + 1LL);
            pos[end].push_back({x, {i % x, i}});
        }
      //  cerr << "ok" << "\n";
    }

    for(int i = 1; i <= a; i++){
        for(auto &p : pos[i]){
            val[p.first][p.second.first] = (val[p.first][p.second.first] - dp[p.second.second] + MOD) % MOD;
        }
        for(int x = 1; x <= blk; x++){
            dp[i] = (dp[i] + val[x][i % x]) % MOD;
        }
        int x = z[i].first, y = z[i].second;
        if(x > blk){
            for(int j = 1; j <= y; j++){
                int nxt = i + j * x;
                if(nxt > a) break;
                dp[nxt] = (dp[nxt] + dp[i]) % MOD;
            }
        } else  {
            if (x==0){
                continue;
            }
            val[x][i % x] = (val[x][i % x] + dp[i]) % MOD;
        }
     //   cerr << i << "\n";
    }

    long long sum = 0;
    for(int i = 1; i <= a; i++){
        sum = (sum + dp[i]) % MOD;
    }
    cout << sum << "\n";

    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...