1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
| # 더 많은 정보는 42jerrykim.github.io 에서 확인하세요.
import sys
input = sys.stdin.readline
MOD = 1_000_000_007
n_line = input().split()
if not n_line:
sys.exit(0)
n = int(n_line[0])
a = [0] * (n + 1)
b = [0] * (n + 1)
coords = []
for i in range(1, n + 1):
ai, bi = map(int, input().split())
a[i] = ai
b[i] = bi + 1
coords.append(ai)
coords.append(b[i])
coords = sorted(set(coords))
inv = [0] * 1005
for i in range(1, 1001):
inv[i] = pow(i, MOD - 2, MOD)
dp = [0] * (n + 1)
pref = [0] * (n + 1)
dp2 = [[0] * (n + 1) for _ in range(n + 1)]
dp[0] = 1
for t in range(1, len(coords)):
st, ed = coords[t - 1], coords[t]
L = ed - st
if L <= 0:
continue
cnd = []
pref[0] = 1
for j in range(1, n + 1):
pref[j] = (pref[j - 1] + dp[j]) % MOD
if a[j] <= st and ed <= b[j]:
cnd.append(j)
K = len(cnd)
if K == 0:
continue
upto = min(K, L)
for k in range(1, upto + 1):
base = 0
if k == 1:
mul = L % MOD
for j in range(k - 1, K):
idx = cnd[j] - 1
val = (pref[idx] * mul) % MOD
base = (base + val) % MOD
dp2[k][j] = base
else:
mul = (inv[k] * ((L - k + 1) % MOD)) % MOD
prev_row = dp2[k - 1]
for j in range(k - 1, K):
val = (prev_row[j - 1] * mul) % MOD
base = (base + val) % MOD
dp2[k][j] = base
for k in range(1, upto + 1):
prev = 0
for j in range(k - 1, K):
cur = dp2[k][j]
add = (cur - prev) % MOD
dp[cnd[j]] = (dp[cnd[j]] + add) % MOD
prev = cur
ans = sum(dp[1:]) % MOD
print(ans)
|