A6645 | 「联合省选 2024」重塑时光
来源省选
时间限制1500ms
内存限制1024MB
通过 / 提交0/0
题目描述
小 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$ 总是存在。
突然,邪恶生物小 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$,表示一条事件发生时间的先后顺序要求。
timeline.in 中读入数据。第一行三个整数 $n, m, k$,分别描述事件的个数,事件之间先后顺序的条数以及小 S 进行的剪断操作次数。
接下来 $m$ 行,每行两个整数 $u, v$,表示一条事件发生时间的先后顺序要求。
输出格式
输出到文件
输出一行一个整数,表示所求答案。
timeline.out 中。输出一行一个整数,表示所求答案。
输入输出样例
输入 #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
暂无题解
C++ 编辑器
输入
输出
可保存默认模板;新题优先使用已保存模板。
当前快捷键仅展示,暂不支持修改。
- 撤销
Ctrl / ⌘ + Z - 重做
Ctrl / ⌘ + Y - 查找
Ctrl / ⌘ + F - 全选
Ctrl / ⌘ + A - 复制
Ctrl / ⌘ + C - 剪切
Ctrl / ⌘ + X - 粘贴
Ctrl / ⌘ + V - 自动排版
工具栏排版按钮 - 草稿保存
编辑时自动保存到本机
历史
提交记录
状态说明时间源码
AI
作答助手
你好,我是作答助手。可以问思路、复杂度、样例含义或代码报错原因;不会直接给出完整 AC 代码。
确定要清空代码吗?