Submission #1016579

#TimeUsernameProblemLanguageResultExecution timeMemory
1016579beaconmcTrains (BOI24_trains)C++14
0 / 100
539 ms60964 KiB
#include <bits/stdc++.h>

typedef long long ll;
#define FOR(i,x,y) for(ll i=x; i<y; i++)
#define FORNEG(i,x,y) for(ll i=x; i>y; i--)

using namespace std;


set<vector<ll>> sus[1005][1005];
ll sums[1005][1005];
ll dp[100005];


int main(){
	ll n;
	cin >> n;
	FOR(i,0,n+1) dp[i] = 0;
	FOR(i,0,1005) FOR(j,0,1005) sus[i][j].clear(), sums[i][j] = 0;
	dp[0] = 1;
	FOR(i,0,n){
		FOR(j,1,1001){
			ll mod = i%j;

			while(!sus[j][mod].empty()){
    			vector<ll> temps = *sus[j][mod].begin();
    			if (temps[0] <= i) sums[j][mod] -= temps[1], sus[j][mod].erase(temps);
    			else break;
			}

			dp[i] += sums[j][mod];
			dp[i] %= 1000000007;
		}



		ll a,b;
		cin >> a >> b;
		if (a==0) continue;
		ll lim = i + a*b + 1;

		if (a > 1000){
			ll cur = i;
			cur += a; 
			while (cur < lim && cur < 100005){
				dp[cur] += dp[i];
				dp[cur] %= 1000000007;
				cur += a;
			}
		}

		
		sus[a][i%a].insert({lim, dp[i]});
		sums[a][i%a] += dp[i];
	}
	ll ans = 0;
	FOR(i,0,n) ans += dp[i];
	cout << ans;
	

	



}
#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...