Submission #1200058

#TimeUsernameProblemLanguageResultExecution timeMemory
1200058WH8Trains (BOI24_trains)C++20
100 / 100
189 ms8668 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define f first
#define s second
#define pll pair<int,int>
#define g0(x) get<0>(x)
#define g1(x) get<1>(x)
#define g2(x) get<2>(x)
const int bk=350;
const int lm=1000000007;
int way[100005];
vector<vector<int>> mod(bk+10);
vector<vector<tuple<int,int,int>>> rm(100005);
vector<pll> v(100005);
signed main(){
	int n;cin>>n;
	for(int i=1;i<=bk;i++){
		mod[i].resize(i);
	}
	for(int i=0;i<n;i++){
		cin>>v[i].f>>v[i].s;
	}
	way[0]=1;
	for(int i=0;i<n;i++){
		int s=v[i].f, t=v[i].s;
		//~ cout<<i<<endl;
		for(int m=1;m<bk;m++){
			//~ printf("m %lld, i mod m %lld, contrib %lld\n", m,i%m, mod[m][i%m]);
			way[i]+=mod[m][i%m];
			way[i]%=lm;
		}
		if(s != 0){
			if(n > bk * s){
				mod[s][i%s]=(mod[s][i%s]+way[i])%lm;
				if(i + t*s < n) rm[i+t*s].push_back({s,i%s,way[i]});
			}
			else{
				for(int j=1;j<=t and i+j*s < n;j++){
					way[i+j*s]=(way[i+j*s]+way[i])%lm;
				}
			}
		}

		for(auto [m, r, rmv]:rm[i]){
			mod[m][r]-=rmv;
			while(mod[m][r]<0)mod[m][r]+=lm;
		}
		//~ for(int j=0;j<n;j++){
			//~ cout<<way[j]<<' ';
		//~ }
		//~ cout<<endl<<endl;
	}
	
	int ans=0;
	for(int i=0;i<n;i++){
		//~ cout<<way[i]<<" ";
		ans+=way[i];
		ans%=lm;
	}
	//~ cout<<endl;
	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...