제출 #1191722

#제출 시각아이디문제언어결과실행 시간메모리
1191722Adeeb_obedoTrains (BOI24_trains)C++20
100 / 100
1247 ms334324 KiB
#include<bits/stdc++.h>
#define int long long
#define ld   double
#define _1 first
#define _2 second
#define yes cout<<"Yes\n"
#define nah cout<<"No\n"
#define FFF ios_base::sync_with_stdio(0);cin.tie(0);
#define ipr pair<int,int>
#define ret return
#define intt int32_t
#define mid ((l+r)/2)
#define pb push_back
#define lll __int128_t
using namespace std;
int tst, ts;
const intt mo = 1e9+7, dx[] = {-1, 1, 0, 0,-1,-1,1,1}, dy[] = {0, 0, -1, 1,-1,1,-1,1};
int mul( int x, int y ) {
    ret ( ( x % mo ) * ( y % mo ) ) % mo;
    ret x*y;
}
int pwo( int x, int y ) {
    int res = 1;
    for( int i = 63; i + 1; i-- )
        res = mul( res, res * ( ( 1ll << i )&y ? x : 1 ) );
    ret res;
}
int dvii( int x, int y ) {
    ret mul( x, pwo( y, mo - 2 ) );
}
int oo( char x ) {
    ret ( int )x - '0';
}
int lgg( int x, int y ) {
    int u = 0;
    while( x ) {
        u++;
        x /= y;
    }
    ret u;
}
int mun( int x, int y ) {
    while( x < y )x += mo;
    ret ( x - y ) % mo;
}
int add( int x, int y ) {
    ret x + y - ( mo * ( x + y >= mo ) );
    ret x + y;
}
int lcm( int x, int y ) {
    ret ( x * y ) / __gcd( x, y );
}
#define endl '\n';
const int M =4007, N = 1e5 + 7, N2 = 5e3 + 7, inf = 2e18 + 7;
intt n,m,k,d[N],x[N],po[N],dp[N];
void solve(){
	cin>>n;
	ipr op[n+7];k=0;
	vector<intt>v[n+7];
	set<ipr>se;
	for(int i=0;i<n;i++)
		cin>>d[i]>>x[i];
		
	
	for(int i=0;i<n;i++){
		dp[i]=1;
		if(d[i]>n)
			d[i]=0;
		if(d[i]==0||se.count({d[i],i%d[i]}))
			continue;
		po[i]=k;
		op[k++]={d[i],i%d[i]};
		se.insert(op[k-1]);
		for(int j=i%d[i];j<n;j+=d[i]){
			v[j].pb(k-1);
			//cout<<i<<" "<<j<<" "<<d[i]<<" "<<d[j];
			if(d[j]==d[i]){
				po[j]=k-1;
				//cout<<9<<endl;
			}
			//cout<<endl;
		}
	}/*
	for(int i=0;i<n;i++)
		cout<<po[i]<<endl;*/
	vector<intt>vd[k];
	
	for(int i=0;i<k;i++)
		vd[i].resize(n/op[i]._1+7);
	for(int i=n-1;i+1;i--){
		if(d[i]!=0)
		dp[i]=add(dp[i],mun(vd[po[i]][i/d[i]+1],
				vd[po[i]][min(i/d[i]+x[i]+1,(int)vd[po[i]].size()-1)]));
		for(auto j:v[i])
			vd[j][i/op[j]._1]=add(dp[i],vd[j][i/op[j]._1+1]);
			
	}
	cout<<dp[0]<<endl;
}
intt main() {
	FFF
    //freopen("revegetate.in", "r", stdin);
    //freopen("revegetate.out", "w", stdout);
	
    tst = 1;
    //cin >> tst;
    for ( ts = 1; ts <= tst; ts++ ) {
        solve();
    }
}
#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...