#P5036. 随机生成树

随机生成树

题目背景

@葛军 改编的水题。

题目描述

rainheavy 在纸上画了 NN 个点(从 11NN 编号),每个点的颜色用一个整数描述。rainheavy 决定用这 NN 个点随机生成一棵树,生成的规则如下:

对于 22 号点到 NN 号点,每个点随机指定连接一个点。ii 号点 (2iN)(2 \le i \le N) 连的点在 ii 的约数中和 ii 的倍数中不超过 NN 的中随机挑选一个。(例如 N=30N=301010 号点的可以连接 11 号,22 号,55 号,2020 号,3030 号)

生成的树中不能有重边。(不然就不叫树了)

树生成完之后,rainheavy 可以计算出这个树有多少个联通块,一个联通块是一些点的集合,需要满足以下两个条件:

1、从集合中任取两个点都满足:两个点颜色相同,且这两个点之间存在一条树边组成的路径,路径上的所有点都和这两个点颜色相同。

2、对于集合中的任意一个点和集合外的任意一个点:两点要么不同色,要么不存在一条树边组成的路径使得路径上所有点都和这两个点同色。

rainheavy 希望计算出生成的树中联通块个数最多时,需要连接哪些边,但是 rainheavy 太强了,不屑于做这种辣鸡题目,更重要的是他要去 AK IOI,于是就把题目扔给了你。

注:边的顺序

  1. 首先,满足连通块个数最多的优先(即对于生成连通块有贡献的优先)。

  2. 同样满足条件 11 时,连接的两个点编号之和较小的边优先。(如满足条件 11 时,连接 33 号点和 55 号点的边比连接 44 号点和 55 号点的边优先)

  3. 同时满足条件 22 时,连接的两个点编号的之中较小的一个较小的边优先。(如满足条件2时,连接2号点和6号点的边比连接3号点和5号点的边优先)

输入格式

第一行一个整数 NN 代表点数。

第二行 NN 个整数,第 ii 个整数 cic_i 代表第 ii 个点的颜色。

输出格式

输出共 N1N-1 行,每行两个整数 x,yx,y 表示需要一条边连接点 xx 和点 yy。(要求 x<yx<y,且输出的顺序满足题目描述中边的顺序)

Tip:由于输出较多,建议用快速输出。(不会就算了顶多 T 掉嘛对不对)

4
3 2 3 2
1 2
1 4
1 3

提示

对于样例的解释:因为 22 号、44 号点会对生成联通块有贡献(33 号你连了也没用),又因为 1+2<1+41+2 \lt 1+4 ,所以 (1,2)(1,2)(1,4)(1,4) 优先输出,最后再输出 (1,3)(1,3)

对于 30%30\% 的数据,2N102 \le N \le 10
对于 60%60\% 的数据,2N50002 \le N \le 5000
对于 80%80\% 的数据,2N2×1052 \le N \le 2 \times 10^5
对于 100%100\% 的数据,2N5×105,1ci1092 \le N \le 5 \times 10^5,1 \le c_i \le 10^9。(反正多了也没用)