제출 #1289501

#제출 시각아이디문제언어결과실행 시간메모리
1289501WH8Boat (APIO16_boat)C++20
0 / 100
155 ms11956 KiB
#include <bits/stdc++.h> using namespace std; #define int unsigned long long #define pll pair<int, int> #define mp make_pair #define pb push_back #define f first #define s second #define endl '\n' #define ld long double #define sz(x) static_cast<int>((x).size()) #define i5 tuple<int,int,int,int,int> const int mod=1e9+7, maxn=200005; vector<int> fac(maxn, 1); void init(){ for(int i=1;i<maxn;i++){ fac[i]=fac[i-1]*i%mod; } } int exp(int a, int b){ if(b==0)return 1; if(b==1)return a; int res=exp(a, b/2); return res * res %mod * (b%2==0?1:a)%mod; } int mod_inv(int a){ return exp(a, mod-2); } int ch[505][505]; signed main(){ init(); int n;cin>>n; set<int> s; vector<int> a(n+1), b(n+1); for(int i=1;i<=n;i++){ cin>>a[i]>>b[i]; b[i]++; s.insert(a[i]); s.insert(b[i]); } vector<pair<int,int>> seg={{0,0}}; vector<int> temp; for(auto it:s)temp.pb(it); for(int i=0;i<sz(temp)-1;i++){ seg.pb({temp[i], temp[i+1]}); } vector<vector<int>> c(seg.size(), vector<int>(n+1, 0)); for(int i=0;i<sz(seg);i++){ int len=seg[i].s-seg[i].f, numer=1; for(int j=0;j<n+1;j++){ if(j > len)break; if(j>=1) numer = numer*(len-j+1)%mod; c[i][j]=mod_inv(fac[j])*numer%mod; } } for(int i=0;i<505;i++){ for(int j=0;j<=i;j++){ ch[i][j]=fac[i]*mod_inv(fac[j])%mod*mod_inv(fac[i-j])%mod; } } /*for(int i=0;i<10;i++){ for(int j=0;j<10;j++){ cout<<ch[i][j]<<" "; }cout<<endl; }*/ for(int j=0;j<sz(seg);j++){ auto [a,b]=seg[j]; /*printf("segment %lld %lld ", a, b); for(int i=0;i<=n;i++){ cout<<c[j][i]<<" "; } cout<<endl;*/ } vector<vector<int>> dp(sz(seg), vector<int>(n+1, 0)); dp[0][0]=1; for(int k=1;k<sz(seg);k++){ for(int i=0;i<=n;i++){ int num=0; dp[k][i]=dp[k-1][i]; for(int j=1;j<=i;j++){ if(a[i-j+1] <= seg[k].f and b[i-j+1] >= seg[k].s) { num++; if(num <= seg[k].s-seg[k].f) dp[k][i]=(dp[k][i]+(dp[k-1][i-j]*c[k][num])%mod)%mod; else { dp[k][i]=(dp[k][i]+(dp[k-1][i-j]*ch[num-1][seg[k].s-seg[k].f])%mod)%mod; } } } //cout<<dp[k][i]<<" "; } //cout<<endl; } int ans=0; for(int j=0;j<=n;j++){ ans=(ans+dp[sz(seg)-1][j])%mod; } cout<<ans-1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...