Loading

LOJ #177. 生成子群阶数

给出 \(n\) 阶置换群 \(S_n\)\(m\) 个元素。求这 \(m\) 个元素生成的子群阶数。

对于一个置换,显然在进行置换环长 \(\operatorname{lcm}-1\) 次操作后必然会变成这个置换的逆,因此可以直接将逆加入。

考虑建立一张 \(n\) 个点的有向图,每个点代表当前 \(p_1\) 的值,每条边的边权是一个置换,连边表示对于一个置换应用上当前置换后 \(p_1\) 的变化情况。由于我们说明了可以加入每个置换的逆,因此可以将边看作无向边,反向边的边权互逆。

接下来我们要计算的就是从 \(1\) 开始,走过若干条边,能复合成多少种不同的置换。考虑对于任意一条路径,\(1\to x\),我们可以把他变成 \(1\to x\to 1\to x\),其中后面两段复合成的置换互逆,如果我们钦定了对于每个 \(x\),最后一段 \(1\to x\) 的路径,那么容易发现对于每个与 \(1\) 处于相同连通块内的点,其方案数是相同的。因此我们只需要计算 \(1\to 1\) 能复合出多少种不同的置换即可。

钦定一棵以 \(1\) 为根的生成树,考虑对于任意一条路径 \(1\to u_1\to u_2\to \dots\to u_k\to 1\),可以把他拆成 \(1\to u_1\to u_2\rightsquigarrow 1,1\rightsquigarrow u_2\to u_3\rightsquigarrow 1,\dots\),其中 \(1\rightsquigarrow x\)\(x\rightsquigarrow 1\) 表示沿着树边走复合成的置换。因此我们只要考虑对于每条边 \((u,v,w)\),求出 \((1\rightsquigarrow u)\circ w\circ(v\rightsquigarrow 1)\) 的置换,然后求这些置换的子群阶数即可。注意到此时的好处是所有转化后的置换都满足 \(p_1=1\),因此我们可以直接忽略第一个元素,将问题变成了一个 \(n\to n-1\) 的子问题。

还有一个问题,在每次递归子问题的过程中,我们会将 \(m\) 个置换变成 \(nm\) 个置换,递归 \(n\) 层就爆了。但是我们声称只要保留 \(O(n)\) 个置换,就能使其的生成子群与原来的生成子群完全相同。找这 \(O(n)\) 个置换的方法受 P10353 [PA2024] Grupa permutacji 的启发,直接对所有置换 shuffle,然后依次以 \(\frac 1 2\) 的概率复合上一个置换,生成 \(O(n)\) 个置换即可。

\(n,m\) 同阶,对于每一个规约子问题的过程,我们需要建出 \(n\) 个点 \(O(n^2)\) 条边的树,对于每条边 \(O(n)\) 计算出一个置换,然后随机生成 \(O(n)\) 个新的置换,复杂度 \(O(n^4)\)。递归解决子问题 \(n\) 层,因此复杂度 \(O(n^5)\)

posted @ 2024-05-21 21:05  wsyear  阅读(109)  评论(0编辑  收藏  举报