#P5689. [CSP-S2019 江西] 多叉堆

[CSP-S2019 江西] 多叉堆

题目背景

JXCSP-S T5

题目描述

多叉堆是一种树形数据结构,本题中我们只考虑小根堆,它满足除了根以外的结点,每个点的权值都不小于父亲的权值。除了叶结点,每个点有至少一个子结点。

初始时有 nn 个结点,编号分别为 0n10 \sim n - 1 ,每个结点都是一棵以自身为根的单点树。接下来按顺序有 qq 次操作,每次操作有以下两种:

  • 1 x y:选择不在同一棵树里的结点 xxyy,将 xx 所在树的根直接接在 yy 所在树的根之下,此时 xxyy 所在树将合并为同一棵树。

  • 2 x:选择结点 xx,设 xx 当前所在树的结点数为 sizesize。你需要计算将 0size10 \sim size - 1sizesize 个数分别填入 xx 所在树的结点中,能够产生多少种不同的多叉堆。两种堆不同当且仅当存在某个结点填入的值不同。由于答案可能很大,你只需要求出答案模 109+710^9+7 后的结果。

输入格式

第一行两个整数 n,qn, q,具体含义见题目描述。

接下来 qq 行每行可能是下面两种格式之一:

  • 1 x' y':你需要通过计算 x=(x+ans)modn,y=(y+ans)modnx=(x'+ans) \bmod n , y=(y'+ans) \bmod n 来得到真正的 xxyy,输入保证 xxyy 所在树不同。

  • 2 x':你需要通过计算 x=(x+ans)modnx=(x'+ans) \bmod n 来得到真正的 xx

其中 ansans 表示上一次 22 操作的输出结果 ,初始时 ans=0ans=0

输出格式

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

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

提示

【输入输出样例 1 说明】

11 次操作时,将 11 所在树的根 11 接在 00 所在树的根 00 下。

22 次操作时,将 22 所在树的根 22 接在 00 所在树的根 00 下。

33 次操作时,11 所在树如图 11,在 0,1,20,1,2 中分别填入 [0,1,2][0,1,2][0,2,1][0,2,1] 可以产生 22 种不同的堆。

44 次操作时 x=(3+2)mod5=0x=(3+2) \bmod 5=0y=(1+2)mod5=3y=(1+2) \bmod 5=3,将 00 所在树的根 00 接在 33 所在树的根 33 下。

55 次操作 时,x=(2+2)mod5=4x=(2+2) \bmod 5=4y=(0+2)mod5=2y=(0+2) \bmod 5=2,将 44 所在树的根 44 接在 22 所在树的根 33 下。

66 次操作 时,x=(4+2)mod5=1x=(4+2) \bmod 5=111 所在树如图 22,在 040\sim 4 中分别填入 [1,2,3,0,4][1,2,3,0,4][1,3,2,0,4][1,3,2,0,4][1,2,4,0,3][1,2,4,0,3][1,4,2,0,3][1,4,2,0,3][1,3,4,0,2][1,3,4,0,2][1,4,3,0,2][1,4,3,0,2][2,4,3,0,1][2,4,3,0,1] 可以产生 88 种不同的堆。

【数据规模与约定】

对于 100%100\% 的数据,0x,y<n3×1050\le x',y' <n \le 3\times 10^51Q3×1051\le Q\le 3\times 10^5

对于不同测试点,我们约定

特殊性质 11:存在 1i<n1\le i<n ,前 ii 次操作均为 11 操作,之后全是 22 操作。

特殊性质 22:对于所有输入 xxyy 本身即是其所在树的根。

感谢 @Fairicle 提供的数据。