제출 #1212830

#제출 시각아이디문제언어결과실행 시간메모리
1212830loomBoat (APIO16_boat)C++20
0 / 100
103 ms6348 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define inf 5e18 #define nl '\n' const int mod = 1e9+7; int exp(int a, int b = mod-2){ int p = 1; while(b > 0){ if(b % 2) p = p * a % mod; a = a * a % mod; b /= 2; } return p; } inline void solve(){ int n; cin>>n; vector<pair<int,int>> ab(n+1), lr; vector<int> v; for(int i=1; i<=n; i++){ int a, b; cin>>a>>b; ab[i] = {a, b}; v.push_back(a); v.push_back(b); } sort(v.begin(), v.end()); lr.push_back({0, 0}); for(int i=0; i < 2*n-1; i++){ if(v[i] != v[i+1]) lr.push_back({v[i], v[i+1]-1}); } lr.push_back({v[2*n-1], v[2*n-1]}); int m = lr.size()-1; int dp[n+1][m+1], dp2[n+1][m+1]; for(int i=0; i<=m; i++) dp[0][i] = 1, dp2[0][i] = 0; int ncr[m+1][n+1]; for(int i=1; i<=m; i++){ auto [l, r] = lr[i]; int len = r-l+1; int p = 1, f = 1; for(int j=len, r=1; r <= min(len, n); j--, r++){ f = f * r % mod; p = p * j % mod; ncr[i][r] = p * exp(f) % mod; } } for(int i=1; i<=n; i++){ auto [a, b] = ab[i]; dp[i][0] = 1; for(int j=1; j<=m; j++){ auto [l, r] = lr[j]; dp[i][j] = dp[i][j-1] + dp2[i-1][j]; dp2[i][j] = dp2[i-1][j]; for(int k=i; k>0; k--){ auto [a, b] = ab[k]; if(i-k+1 > r-l+1 or l < a or r > b) continue; int x = dp[k-1][j-1] * ncr[j][i-k+1]; dp[i][j] += x; dp[i][j] %= mod; dp2[i][j] += x; dp2[i][j] %= mod; } } } cout<<dp[n][m]-1; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(NULL);cout.tie(NULL); int t = 1; //cin>>t; while(t--) solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...