제출 #1063215

#제출 시각아이디문제언어결과실행 시간메모리
1063215antonTrains (BOI24_trains)C++17
100 / 100
212 ms29380 KiB
#include<bits/stdc++.h>

using namespace std;

#define int long long 
#define pii pair<int, int>

const int MAX_N = 1e5 + 10;
const int MOD = 1e9+7;
const int K = 300;
int N;

int d[MAX_N];
int x[MAX_N];
int dp[MAX_N];
int sufs[K][K];
vector<unordered_map<int, int>> req;

signed main(){
    cin>>N;
    req.resize(N+1);
    for(int i = 0; i<N; i++){
        cin>>d[i]>>x[i];
        req[i][d[i]] = -1;
        req[min(N, i+d[i]*x[i])][d[i]] = -1;

    }

    for(auto it = req[N].begin(); it!=req[N].end(); ++it){
        it->second = 0;
    }

    fill(&sufs[0][0], &sufs[K-1][K], 0LL);
    for(int i = N-1; i>=0; i--){
        for(auto it = req[i].begin(); it!=req[i].end(); ++it){
            int cur_d = it->first;
            int res = 0;
            if(cur_d!=0){
                if(cur_d<K){
                    res = (res + sufs[cur_d][i%cur_d])%MOD;
                }
                else{
                    for(int j = i+cur_d; j<N; j+=cur_d){
                        res =(res+dp[j])%MOD;
                    }
                }
            }

            it->second = res;           
        }

        dp[i] = (req[i][d[i]]-req[min(N, i+x[i]*d[i])][d[i]]+MOD+1)%MOD;
        for(int j = 1; j<K; j++){
            sufs[j][i%j] = (sufs[j][i%j] + dp[i])%MOD;
        }

    }

    cout<<dp[0]<<endl;
}
#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...