Submission #859921

#TimeUsernameProblemLanguageResultExecution timeMemory
859921bliss08Boat (APIO16_boat)C++17
100 / 100
480 ms4692 KiB
#include <bits/stdc++.h>
#define ll long long
#define MOD (ll)(1e9 + 7)

using namespace std;

ll lo[1020], hi[1020];

ll A[510], B[510], baser[510];

ll dp[510][1020];

ll cnt, tot, N;

void add_mod(ll& ret, ll params)
{
	ret += params;
	ret %= MOD;
}

void mul_mod(ll& ret, ll params)
{
	ret *= params;
	ret %= MOD;
}

void sub_mod(ll& ret, ll params)
{
	ret = (ret - params + MOD) % MOD;
}

void precomp()
{
	baser[1] = 1;

	for (ll i = 2; i <= N; i++)
	{
		baser[i] = MOD - (MOD / i);
		mul_mod(baser[i], baser[MOD % i]);
	}

	stable_sort(hi + 1, hi + cnt + 1);
	cnt = unique(hi + 1, hi + cnt + 1) - hi;

	for (ll i = 1; i <= N; i++)
	{
		A[i] = lower_bound(hi + 1, hi + cnt, A[i]) - hi;
		B[i] = lower_bound(hi + 1, hi + cnt, B[i]) - hi;
	}

	cnt -= 2;

	for (ll i = 1; i <= cnt; i++)
	{
		lo[i] = hi[i + 1];
		sub_mod(lo[i], hi[i]);
	}
}

void solve()
{
	for (ll i = 0; i <= cnt; i++)
		dp[0][i] = 1;

	for (ll i = 1; i <= N; i++)
	{
		for (ll j = A[i], t = B[i]; j < t; j++)
		{
			ll C = lo[j], r = lo[j], inn = 1;

			for (ll k = i - 1; k >= 0; k--)
			{
				ll tmp = dp[k][j - 1];
				mul_mod(tmp, C);
				add_mod(dp[i][j], tmp);

				if (A[k] > j || j >= B[k])
					continue;

				r++, inn++;
				tmp = C;
				mul_mod(tmp, r);
				mul_mod(tmp, baser[inn]);
				C = tmp;
			}
		}

		for (ll j = 2; j <= cnt; j++)
			add_mod(dp[i][j], dp[i][j - 1]);
	}

	for (ll i = 1; i <= N; i++)
		add_mod(tot, dp[i][cnt]);
}

int main()
{
	cin >> N;

	for (ll i = 1; i <= N; i++)
	{
		cin >> A[i] >> B[i];
		hi[++cnt] = A[i];
		hi[++cnt] = ++B[i];
	}

	precomp();

	solve();

	cout << tot;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...