[CSP-S2019 江西] 多叉堆

题目背景

JXCSP-S T5

题目描述

多叉堆是一种树形数据结构,本题中我们只考虑小根堆,它满足除了根以外的结点,每个点的权值都不小于父亲的权值。除了叶结点,每个点有至少一个子结点。 初始时有 $n$ 个结点,编号分别为 $0 \sim n - 1$ ,每个结点都是一棵以自身为根的单点树。接下来按顺序有 $q$ 次操作,每次操作有以下两种: * `1 x y`:选择不在同一棵树里的结点 $x$ 和 $y$,将 $x$ 所在树的根直接接在 $y$ 所在树的根之下,此时 $x$ 和 $y$ 所在树将合并为同一棵树。 * `2 x`:选择结点 $x$,设 $x$ 当前所在树的结点数为 $size$。你需要计算将 $0 \sim size - 1$ 这 $size$ 个数分别填入 $x$ 所在树的结点中,能够产生多少种不同的多叉堆。两种堆不同当且仅当存在某个结点填入的值不同。由于答案可能很大,你只需要求出答案模 $10^9+7$ 后的结果。

输入输出格式

输入格式


第一行两个整数 $n, q$,具体含义见题目描述。 接下来 $q$ 行每行可能是下面两种格式之一: * `1 x' y'`:你需要通过计算 $x=(x'+ans) \bmod n , y=(y'+ans) \bmod n$ 来得到真正的 $x$ 和 $y$,输入保证 $x$ 和 $y$ 所在树不同。 * `2 x'`:你需要通过计算 $x=(x'+ans) \bmod n$ 来得到真正的 $x$。 其中 $ans$ 表示上一次 $2$ 操作的输出结果 ,初始时 $ans=0$。

输出格式


对于每次 $2$ 操作输出一行一个整数表示答案。

输入输出样例

输入样例 #1

5 6
1 1 0
1 2 0
2 1
1 3 1
1 2 0
2 4

输出样例 #1

2
8

说明

#### 【输入输出样例 1 说明】 第 $1$ 次操作时,将 $1$ 所在树的根 $1$ 接在 $0$ 所在树的根 $0$ 下。 第 $2$ 次操作时,将 $2$ 所在树的根 $2$ 接在 $0$ 所在树的根 $0$ 下。 第 $3$ 次操作时,$1$ 所在树如图 $1$,在 $0,1,2$ 中分别填入 $[0,1,2]$ 和 $[0,2,1]$ 可以产生 $2$ 种不同的堆。 第 $4$ 次操作时 $x=(3+2) \bmod 5=0$,$y=(1+2) \bmod 5=3$,将 $0$ 所在树的根 $0$ 接在 $3$ 所在树的根 $3$ 下。 第 $5$ 次操作 时,$x=(2+2) \bmod 5=4$,$y=(0+2) \bmod 5=2$,将 $4$ 所在树的根 $4$ 接在 $2$ 所在树的根 $3$ 下。 第 $6$ 次操作 时,$x=(4+2) \bmod 5=1$,$1$ 所在树如图 $2$,在 $0\sim 4$ 中分别填入 $[1,2,3,0,4]$,$[1,3,2,0,4]$,$[1,2,4,0,3]$,$[1,4,2,0,3]$,$[1,3,4,0,2]$,$[1,4,3,0,2]$,$[2,4,3,0,1]$ 可以产生 $8$ 种不同的堆。 ![](https://cdn.luogu.com.cn/upload/image_hosting/mqsr3nri.png) #### 【数据规模与约定】 对于 $100\%$ 的数据,$0\le x',y' <n \le 3\times 10^5$,$1\le Q\le 3\times 10^5$。 对于不同测试点,我们约定 ![](https://cdn.luogu.com.cn/upload/image_hosting/44j0elzy.png) 特殊性质 $1$:存在 $1\le i<n $,前 $i$ 次操作均为 $1$ 操作,之后全是 $2$ 操作。 特殊性质 $2$:对于所有输入 $x$ 和 $y$ 本身即是其所在树的根。 感谢 @Fairicle 提供的数据。