Submission #1278315

#TimeUsernameProblemLanguageResultExecution timeMemory
1278315ducksaysquackTrains (BOI24_trains)C++20
34 / 100
190 ms5136 KiB
#include <bits/stdc++.h>
#define int long long
#define f first
#define s second
using namespace std;
const int M = 1e9+7;
signed main() {
	int n; cin >> n; vector<int> dp(n); vector<vector<int>> c(320,vector<int>(320)); dp[0] = 1;
	priority_queue<pair<int,pair<int,int>>> p;
	for(int i=0;i<n;i++) {
		int a, b; cin >> a >> b;
		for(int j=1;j*j<=n;j++) dp[i] += c[j][i%j], dp[i] %= M;
		if(a == 0) continue;
		if(a*a <= n) {c[a][i%a] += dp[i], c[a][i%a] %= M; p.push({i+a*b,{a,dp[i]}});}
		else for(int j=i+a;j<min(i+a*b+1,n);j+=a) dp[j] += dp[i], dp[j] %= M;
		while(!p.empty() && p.top().f == i) {c[p.top().s.f][i%p.top().s.f] += M-p.top().s.s, c[p.top().s.f][i%p.top().s.f] %= M; p.pop();}
	}
	int ans = 0; for(int i=0;i<n;i++) ans += dp[i];
	cout << ans%M << '\n';
}
#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...