Submission #1264617

#TimeUsernameProblemLanguageResultExecution timeMemory
1264617Alihan_8Boat (APIO16_boat)C++17
0 / 100
2 ms1344 KiB
#include <bits/stdc++.h>

using namespace std;

const int Mod = 1e9 + 7;

void add(int &x, const int &y){
	x += y;
	
	if ( x >= Mod ) x -= Mod;
}

int inv[501];

int binPow(int x, int y){
	int res = 1;
	
	for (; y > 0; x = x * 1LL * x % Mod, y >>= 1 ){
		if ( y & 1 ) res = res * 1LL * x % Mod;
	}
	
	return res;
}

signed main(){
	for ( int i = 0; i <= 500; i++ ) inv[i] = binPow(i, Mod - 2);
	
	int n; cin >> n;
	
	vector <int> a(n), b(n), p;
	
	for ( int i = 0; i < n; i++ ){
		cin >> a[i] >> b[i];
		
		p.push_back(a[i]);
		p.push_back(b[i]);
	}
	
	sort(begin(p), end(p));
	p.resize(unique(begin(p), end(p)) - begin(p));
	
	int m = size(p);
	
	vector <vector<int>> dp(m, vector <int> (n + 1));
	
	dp[0][0] = 1;
	
	for ( int i = 0; i + 1 < m; i++ ){
		int len = p[i + 1] - p[i];
		
		for ( int j = 0; j <= n; j++ ){
			add(dp[i + 1][j], dp[i][j]);
			
			if ( j + 1 <= n ){
				add(dp[i][j + 1], dp[i][j]);
				
				if ( a[i] <= p[i] && p[i + 1] <= b[i] + 1 ){
					int sum = 0, id = 0, binom = 1;
					
					for ( int k = j; k < n; k++ ){
						if ( a[k] <= p[i] && p[i + 1] <= b[k] + 1 ){
							id += 1;
							
							if ( id <= len ){
								binom = binom * 1LL * (len - id + 1) % Mod * inv[id] % Mod;
								
								add(sum, binom);
							}
							
							add(dp[i + 1][k + 1], dp[i][j] * 1LL * sum % Mod);
						}
					}
				}
			}
		}
	}
	
	cout << (dp[m - 1][n] - 1 + Mod) % Mod << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...