Submission #1247671

#TimeUsernameProblemLanguageResultExecution timeMemory
1247671lambd47Trains (BOI24_trains)C++20
100 / 100
334 ms278328 KiB
#include <bits/stdc++.h>
 
using namespace std;
 
 
std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());
 
#define int long long
const int sqr=350;
const int MX=1e5+7;
const int MOD=1e9+7;
int dp[sqr][MX+2*sqr];
int id[sqr][sqr];//onde eu to na mod i resto j 
 
 
void solve() {
//    vector<vector<vector<int>>> dp(sqr+1);//dp[i][j][k] mod i resto j prefixo k estado besta j
    int n;cin>>n;
    vector<int> resp(n,0);
    vector<int> x(n);
    vector<int> d(n);
    for(int i=0;i<n;i++)cin>>d[i]>>x[i];
 
    for(int i=1;i<sqr;i++){
        for(int j=0;j<i;j++){
            id[i][j]=i+j;
        }
    }
 
    for(int i=n-1;i>=0;i--){
        if(d[i]<sqr){
            if(d[i]==0)resp[i]=1;
            else{
                resp[i]=1;
                resp[i]+=((dp[d[i]][id[d[i]][i%d[i]]]-dp[d[i]][max((int)0,id[d[i]][i%d[i]]-(x[i]*d[i]))])%MOD+MOD)%MOD;
                resp[i]%=MOD;
            }
        }
        else{
            int idat=i;
            while(idat+d[i]<n && x[i]--){
                idat+=d[i];
                resp[i]+=resp[idat];
                resp[i]%=MOD;
            }
            resp[i]++;
            resp[i]%=MOD;
        }
 
        for(int j=1;j<sqr;j++){
            id[j][i%j]+=j;
            dp[j][id[j][i%j]]=(dp[j][id[j][i%j]-j]+resp[i])%MOD;
        }
    }
    cout<<resp[0]%MOD;
    return;
 
 
 
 
}
 
int32_t main() {
    std::cin.tie(0)->sync_with_stdio(0); 
    std::cin.exceptions(std::cin.failbit);
 
    int T = 1;
//    std::cin >> T;
    while(T--) {
        solve();
    }
 
	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...