Submission #1289501

#TimeUsernameProblemLanguageResultExecution timeMemory
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...