题目名称 4315. [联合省选 2024] 重塑时光
输入输出 timeline.in/out
难度等级 ★★★★
时间限制 1500 ms (1.5 s)
内存限制 1024 MiB
测试数据 20
题目来源 GravatarRpUtl 于2026-02-23加入
开放分组 全部用户
提交状态
分类标签
分享题解
通过:1, 提交:1, 通过率:100%
GravatarRpUtl 100 6.542 s 6.18 MiB C++
关于 重塑时光 的近10条评论(全部评论)

4315. [联合省选 2024] 重塑时光

★★★★   输入文件:timeline.in   输出文件:timeline.out   简单对比
时间限制:1.5 s   内存限制:1024 MiB

【题目描述】

小 T 正在研究某段时间中所发生的事件。经观测,有 $n$ 个编号为 $1\sim n$ 的事件在这段时间内按顺序依次发生,第 $i$ 个发生的是事件 $p_i$。这个描述事件发生顺序的排列 $p$ 可称为这段时间的时间线。

突然,邪恶生物小 S 攻击了这条时间线,将这 $n$ 个事件的发生顺序 $p$ 变为了在所有长为 $n$ 的排列中等概率随机选取的一个排列。不仅如此,小 S 还用剪刀把时间线剪断,通过进行 $k$ 次操作,将排列 $p$ 分割成了 $(k + 1)$ 段。

具体而言,在小 S 进行第 $i$ 次操作时,排列 $p$ 和之前所有插入的剪断点构成了一个长度为 $(n + i - 1)$ 的序列。该序列包括所有相邻元素之间和序列开头、末尾处共有 $(n + i)$ 个插入位置。小 S 将从这些插入位置中等概率随机选取一个位置,插入一个新的剪断点。最后,小 S 从最终被插入的 $k$ 个剪断点处把序列剪开,将排列 $p$ 分割成了 $(k + 1)$ 段序列。这 $(k + 1)$ 段序列中可能有空序列。

为了拯救这条即将毁灭的时间线,小 T 决定把这 $(k + 1)$ 段序列按某种顺序重新拼接成一个长度为 $n$ 的排列,形成一条新的时间线。不过,由于事件之间存在一定的逻辑关系,事件的发生时间之间也存在一些先后顺序要求。经研究,共存在 $m$ 条先后顺序要求 $(u, v)$,要求事件 $u$ 的发生时间必须在事件 $v$ 之前。也就是说,$u$ 在时间线中的出现位置必须在 $v$ 之前。

请你设计程序,计算有多大的概率,存在至少一种重新排列这 $(k + 1)$ 段序列,并将其重新拼接为一条新的时间线的方案,能够使所有的 $m$ 条事件发生时间之间的先后顺序要求都得到满足。

为了避免精度误差,请你输出答案对 $10^9 +7$ 取模的结果。形式化地,可以证明答案可被表示为一最简分数 $\frac{p}{q}$,请你输出一个 $x$ 满足 $0 \le x < 10^9+7$ 且 $qx \equiv p \pmod {10^9+7}$。可以证明在题目条件下这样的 $x$ 总是存在。

【输入格式】

第一行三个整数 $n, m, k$,分别描述事件的个数,事件之间先后顺序的条数以及小 S 进行的剪断操作次数。

接下来 $m$ 行,每行两个整数 $u, v$,表示一条事件发生时间的先后顺序要求。

【输出格式】

输出一行一个整数,表示所求答案。

【样例输入1】

2 1 1
1 2

【样例输出1】

666666672

【样例输入2】

3 0 2

【样例输出2】

1

【样例输入3】

4 4 4
1 2
1 3
1 4
2 4

【样例输出3】

937500007

【样例说明】


【样例 1 解释】


假如事件 $1$ 的发生时间早于事件 $2$,那么无论怎样拼接都是可行方案,一定可以满足要求。否则,只有剪断时间线的位置位于事件 $1$ 和事件 $2$ 的发生时间之间,才能满足要求。答案为 $\frac{1}{2}+\frac{1}{2}\times \frac{1}{3}=\frac{2}{3}$。

【样例 2 解释】

没有任何事件发生时间之间的先后顺序要求,因此无论怎样拼接都是可行的方案,答案为 $1$。

【样例 4】

见附件中的 timeline4.in/ans。

【样例 5】

见附件中的 timeline5.in/ans。

该组样例满足数据范围中的特殊性质 B。

【样例 6】

见附件中的 timeline6.in/ans。

该组样例满足数据范围中的特殊性质 A。

【样例 7】

见附件中的 timeline7.in/ans。


【数据规模与约定】

对于所有数据:

【提示】

timeline.zip