제출 #1016684

#제출 시각아이디문제언어결과실행 시간메모리
1016684beaconmcTrains (BOI24_trains)C++14
100 / 100
1187 ms25680 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;


multiset<vector<ll>> sus[505][505];
ll sums[505][505];
ll dp[100005];


int main(){
	ll n;
	cin >> n;
	FOR(i,0,n+1) dp[i] = 0;
	FOR(i,0,505) FOR(j,0,505) sus[i][j].clear(), sums[i][j] = 0;
	dp[0] = 1;
	FOR(i,0,n){
		FOR(j,1,501){
			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];
    				sums[j][mod] += 1000000007;
    				sums[j][mod] %= 1000000007;

    				sus[j][mod].erase(sus[j][mod].find(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 > 500){
			ll cur = i;
			cur += a; 
			while (cur < lim && cur < 100005){
				dp[cur] += dp[i];
				dp[cur] %= 1000000007;
				cur += a;
			}
		}else{
			sus[a][i%a].insert({lim, dp[i]});
			sums[a][i%a] += dp[i];
			sums[a][i%a] %= 1000000007;


		}

		

	}
	ll ans = 0;
	FOR(i,0,n){

		ans += dp[i];
	}
	cout << ans%1000000007;
	

	



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