Submission #1203243

#TimeUsernameProblemLanguageResultExecution timeMemory
1203243AlgorithmWarriorTrains (BOI24_trains)C++20
100 / 100
229 ms127232 KiB
#include <bits/stdc++.h>

using namespace std;

void maxself(int& a,int b){
    if(a<b)
        a=b;
}

int const MAX=1e5+5;
int const MOD=1e9+7;
int const BLOCK_SIZE=316;
int dp[MAX];
int lg[MAX],rep[MAX];
int sum[MAX][BLOCK_SIZE+5];
int n;

void read(){
    cin>>n;
    int i;
    for(i=1;i<=n;++i){
        cin>>lg[i]>>rep[i];
    }
}

int calc_dp(){
    dp[1]=1;
    int i,j;
    int ans=0;
    for(i=1;i<=n;++i){
        for(j=1;j<=BLOCK_SIZE;++j){
            if(i-j>0){
                sum[i][j]+=sum[i-j][j];
                sum[i][j]%=MOD;
            }
            dp[i]+=sum[i][j];
            dp[i]%=MOD;
        }
        if(lg[i] && rep[i]){
            if(lg[i]<=BLOCK_SIZE){
                if(i+lg[i]<=n){
                    sum[i+lg[i]][lg[i]]+=dp[i];
                    sum[i+lg[i]][lg[i]]%=MOD;
                }
                if(i+1LL*lg[i]*(rep[i]+1)<=n){
                    sum[i+lg[i]*(rep[i]+1)][lg[i]]+=MOD-dp[i];
                    sum[i+lg[i]*(rep[i]+1)][lg[i]]%=MOD;
                }
            }
            else{
                for(j=i+lg[i];j<=i+1LL*lg[i]*rep[i] && j<=n;j+=lg[i]){
                    dp[j]+=dp[i];
                    dp[j]%=MOD;
                }
            }
        }
        ans+=dp[i];
        ans%=MOD;
    }
    return ans;
}

void write(int ans){
    cout<<ans;
}

int main()
{
    read();
    write(calc_dp());
    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...