Submission #1358066

#TimeUsernameProblemLanguageResultExecution timeMemory
1358066MrAndriaTrains (BOI24_trains)C++20
0 / 100
193 ms5548 KiB
#include <bits/stdc++.h>
using namespace std;
#define ff first
#define ss second
#define pb push_back
#define int long long
int n,d[100005],x[100005],dp[100005],add[400][400],mod=1e9+7;
vector <int> vec[100005];
signed main(){
    cin>>n;
    int k=ceil(sqrt(n));
    for(int i=1;i<=n;i++){
        cin>>d[i]>>x[i];
    }
    int ans=0;
    dp[1]=1;
    for(int i=1;i<=n;i++){
        ans+=dp[i];
        ans%=mod;
        if(d[i]>k){
            for(int j=1;j<=x[i];j++){
                dp[i+j*d[i]]+=dp[i];
                dp[i+j*d[i]]%=mod;
            }
            continue;
        }
        for(auto u:vec[i]){
            add[u%d[u]][d[u]]-=dp[u];
            add[u%d[u]][d[u]]+=mod;
            add[u%d[u]][d[u]]%=mod;
        }
        if(d[i]!=0){
            add[i%d[i]][d[i]]+=dp[i];
            add[i%d[i]][d[i]]%=mod;

            if(i+x[i]*d[i]<=n){
                vec[i+x[i]*d[i]].pb(i);
            }
        }
        for(int j=1;j<=k;j++){
            dp[i+j]+=add[i%j][j];
            dp[i+j]%=mod;
        }
    }
    cout<<ans<<endl;

}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...