Submission #1358108

#TimeUsernameProblemLanguageResultExecution timeMemory
1358108MrAndriaTrains (BOI24_trains)C++20
0 / 100
933 ms1936 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],dp1[100005],add[400][400],mod=1e9+7;
vector <int> vec[100005];
signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin>>n;
    int k=ceil(sqrt(n));
    for(int i=1;i<=n;i++){
        cin>>d[i]>>x[i];
    }
    int ans=0,ans1=0;
    dp[1]=1;
    dp1[1]=1;
    for(int i=1;i<=n;i++){
        dp[i]%=mod;
        ans+=dp[i];
        ans%=mod;
        ans1+=dp1[i];
        for(int j=1;j<=x[i];j++){
            if(i+j*d[i]>n)break;
            dp1[i+j*d[i]]+=dp1[i];
            dp1[i+j*d[i]]%=mod;
        }
        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;
            add[u%d[u]][d[u]]%=mod;
        }
        if(d[i]!=0 and d[i]<=k){
            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<=min(k,n-i);j++){
            dp[i+j]+=add[i%j][j];
            dp[i+j]%=mod;
        }
        if(d[i]>k){
            for(int j=1;j<=x[i];j++){
                if(i+j*d[i]>n)break;
                dp[i+j*d[i]]+=dp[i];
                dp[i+j*d[i]]%=mod;
            }
        }
        
    }
    if(ans1<ans){
        assert(0);
    }
    cout<<ans1<<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...