제출 #1191718

#제출 시각아이디문제언어결과실행 시간메모리
1191718Adeeb_obedoTrains (BOI24_trains)C++20
100 / 100
1352 ms565344 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*3)/op[i]._1+27); 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...