제출 #1237407

#제출 시각아이디문제언어결과실행 시간메모리
1237407zadniprovskaTrains (BOI24_trains)C++20
0 / 100
18 ms19272 KiB
#include <bits/stdc++.h>

using namespace std;


#define ll int
#define pll pair<ll, ll>

const ll DIM = 1e5 + 7;
const ll mod = 1e9 + 7;
const ll sq = 350;

ll dp[DIM];
ll s[sq+7][sq+7];
ll er[DIM][sq+7];

int main(){
    ios::sync_with_stdio(false);cin.tie(nullptr); cout.tie(nullptr);
    

    ll n;
    cin >> n;


    dp[1] = 1;
    for (int i=1; i<=n; i++) {
        ll d, x;
        cin >> d >> x;

        for (int j=1; j<=sq; j++) {
            dp[i] += s[j][i%j];
            dp[i] %= mod;

            s[j][i%j] -= er[i][j];
            er[i][j] = 0;
            if (s[j][i%j] < 0) s[j][i%j] += mod;
        }

        if (d == 0) continue;

        if (x <= sq) {
            for (int j=i+d; j<=min(n, i + x*d); j+=d) {
                dp[j] += dp[i];
                dp[j] %= mod;
            }

            continue;
        }

        
        if (d >= sq) {
            for (int j=i+d; j<=min(n, i + x*d); j+=d) {
                dp[j] += dp[i];
                dp[j] %= mod;
            }
        }
        else {
            s[d][i%d] += dp[i];
            s[d][i%d] %= mod;

            er[i + x*d][d] += dp[i];
        }
    }


    ll answer = 0;
    for (int i=1; i<=n; i++) {
        answer += dp[i];
        answer %= mod;
    }
    cout << answer << 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...