OI中的群论——补充习题详解

前言

本篇文章的内容为上一次课中 gh 巨佬留下的 T8, T10 的题解。

这两道题难度较大,考察了 Polya/Burnside 定理,组合数学能力与反演能力。解法步骤可能较多,但是如果你耐下心来看,肯定还是能看懂的。

本篇文章写得非常详细,希望能够给予你帮助。

T8

Description

请求出,对于所有节点数为 n n n,边的颜色种数不超过 m m m 的无向完全图,最多有几张图满足两两不同构。

A, B 两个图同构,当且仅当将 A 图的节点经过一定的重新标号之后,A 图的顶点集和边集与 B 图一一对应。

答案对 p p p 取模。

1 ≤ n ≤ 53 , 1 ≤ m ≤ 1000 , n < p ≤ 1 0 9 1 \le n \le 53, 1 \le m \le 1000,n<p \le 10^9 1n53,1m1000,n<p109

Solution

算法一

根据 Burnside 引理,我们可以枚举所有关于点的置换 ( 1 , 2 , 3 , 4 … a n a 1 , a 2 , a 3 , a 4 … a n ) \begin{pmatrix} 1,2,3,4 \dots a_n \\ a_1,a_2,a_3,a_4 \dots a_n\end{pmatrix} (1,2,3,4ana1,a2,a3,a4an) ,并求出存在多少个图,满足将点 1 , 2 , 3 , 4 … n 1,2,3,4 \dots n 1,2,3,4n 分别映射到 a 1 , a 2 , a 3 … a n a_1,a_2,a_3 \dots a_n a1,a2,a3an 后图不变。显然,将这些方案数求和,再除以 n ! n! n! 即为答案。

我们将 ( a 1 , a 2 … a n ) (a_1,a_2 \dots a_n) (a1,a2an) 给拆成许多置换的乘积,例如 ( 1 , 2 , 3 , 4 3 , 4 , 1 , 2 ) = ( 1 , 3 3 , 1 ) ⋅ ( 2 , 4 4 , 2 ) \begin{pmatrix} 1,2,3,4 \\ 3,4,1,2 \end{pmatrix}=\begin{pmatrix} 1,3 \\ 3,1 \end{pmatrix} \cdot \begin{pmatrix} 2,4 \\ 4,2 \end{pmatrix} (1,2,3,43,4,1,2)=(1,33,1)(2,44,2)

令这些置换的大小分别为 b 1 , b 2 … b m b_1,b_2 \dots b_m b1,b2bm(这里的 m m m 表示拆分后置换的数量)。

考虑边 ( u , v ) (u,v) (u,v) 必须与哪些边的颜色相同。因为 u , v u,v u,v 可能在同一置换中也可能在不同置换中,所以分类讨论如下:

两个端点在同一置换中

u , v u,v u,v 所在的置换为 S S S

我们令两条边属于同一个等价类当且仅当这两条边可以通过有限次映射互相得到。例如,当置换 S = ( 1 , 2 , 3 , 4 , 5 , 6 2 , 3 , 4 , 5 , 6 , 1 ) S=\begin{pmatrix} 1,2,3,4,5,6 \\ 2,3,4,5,6,1 \end{pmatrix} S=(1,2,3,4,5,62,3,4,5,6,1) 时,下图中颜色相同的边属于同一个等价类:

在这里插入图片描述
图是盗的

不难发现S内部的等价类的数量 ⌊ ∣ S ∣ 2 ⌋ \lfloor \dfrac {|S|} 2 \rfloor 2S

下面给出简要证明:
①若 n n n 为偶数,那么恰有 n 2 − 1 \dfrac {n} 2 -1 2n1 个大小为 n n n 的等价类与一个大小为 n 2 \dfrac n 2 2n 的等价类;
②若 n n n 为奇数,那么恰有 n − 1 2 \dfrac {n-1} 2 2n1 个大小为 n n n 的等价类。

因此,无论 n n n 是奇是偶,其等价类的数量恰为 ⌊ ∣ S ∣ 2 ⌋ \lfloor \dfrac {|S|} 2 \rfloor 2S

由于有 m m m 个子置换,每个置换内部属于同一个等价类的边的颜色必须相同,所以这一情况的贡献为
∑ i = 1 m ⌊ b i 2 ⌋ \sum_{i=1}^m \lfloor \frac {b_i} 2 \rfloor i=1m2bi

两个端点在不同置换中

令边 ( u , v ) (u,v) (u,v) 的两个端点分别属于第 x x x 个与第 y y y 个置换。令这两个置换的大小分别为 b x , b y b_x,b_y bx,by

我们令两条边属于同一个等价类当且仅当这两条边可以通过有限次映射互相得到。

例如,当第 x x x 个置换为 ( 1 , 2 , 3 , 4 2 , 3 , 4 , 1 ) \begin{pmatrix} 1,2,3,4 \\ 2,3,4,1 \end{pmatrix} (1,2,3,42,3,4,1) ,第 y y y 个置换为 ( 5 , 6 6 , 5 ) \begin{pmatrix} 5,6 \\ 6,5 \end{pmatrix} (5,66,5) 时,第一个等价类包含了边 ( 1 , 6 ) (1,6) (1,6) ( 2 , 5 ) (2,5) (2,5) ( 3 , 6 ) (3,6) (3,6) ( 4 , 5 ) (4,5) (4,5) ,第二个等价类包含了边 ( 1 , 5 ) (1,5) (1,5) ( 2 , 6 ) (2,6) (2,6) ( 3 , 5 ) (3,5) (3,5) ( 4 , 6 ) (4,6) (4,6) 。。

由于 ( u , v ) (u,v) (u,v) 被映射 lcm ( b x , b y ) \text{lcm}(b_x,b_y) lcm(bx,by) 次后会重新变为 ( u , v ) (u,v) (u,v) ,从而不同的等价类的数量为 b x × b y lcm ( b x , b y ) = gcd ⁡ ( b x , b y ) \frac {b_x \times b_y} {\text{lcm} (b_x,b_y)}=\gcd(b_x,b_y) lcm(bx,by)bx×by=gcd(bx,by)

于是这一部分对答案的贡献为

∑ i = 1 m ∑ j = i + 1 m gcd ⁡ ( b i , b j ) \sum_{i=1}^m \sum_{j=i+1}^m \gcd(b_i,b_j) i=1mj=i+1mgcd(bi,bj)


综上所述,我们暴力枚举置换 a a a ,求出数组 b b b 并算出上面两个值即可。

时间复杂度 O ( n ! × n 2 ) O(n! \times n^2) O(n!×n2) 。光荣爆炸。

算法二

f ( b ) = ∑ i = 1 m ⌊ b i 2 ⌋ + ∑ i = 1 m ∑ j = i + 1 m gcd ⁡ ( b i , b j ) f(b)=\sum_{i=1}^m \lfloor \dfrac {b_i} 2 \rfloor+\sum_{i=1}^m \sum_{j=i+1}^m \gcd(b_i,b_j) f(b)=i=1m2bi+i=1mj=i+1mgcd(bi,bj)

不难发现, f ( b ) f(b) f(b) 为仅关于 b b b 的函数。换言之,我们并不需要知道具体的置换 a a a,只需要知道其所有子置换的大小。同时,我们可以发现,将 b b b 按照任意顺序排列后 f ( b ) f(b) f(b) 不变。

这两个性质启发我们去枚举满足 b 1 ≤ b 2 ≤ b 3 ≤ ⋯ ⋯ ≤ b m b_1 \le b_2 \le b_3 \le \cdots \cdots \le b_m b1b2b3bm 的数组 b b b

g ( b ) g(b) g(b) 表示满足 ⌊ \lfloor 所有 m m m 个子置换的大小分别为 b 1 , b 2 , b 3 ⋯ ⋯ b m b_1,b_2,b_3 \cdots \cdots b_m b1,b2,b3bm ⌉ \rceil 的置换 c c c 的数量。答案显然为 1 n ! ∑ b m f ( b ) × g ( b ) \frac 1 {n!}\sum_b m^{f(b)} \times g(b) n!1bmf(b)×g(b)

f f f 我们已经能快速求出,现在关键在于快速求出 g g g

首先思考整个置换的方案数。我们任意安排 1 , 2 , 3 , ⋯   , n 1,2,3,\cdots,n 1,2,3,,n 分别被映射到乘了什么,有 n ! n! n! 种方案。对于属于同子置换的 b i b_i bi 个元素,它内部的每一种排列都被算了一次,于是还要除以 ∏ i = 1 m b i ! \prod_{i=1}^m b_i! i=1mbi!

同时,第 i i i 个子置换本身有 b i ! b i \dfrac {b_i!} {b_i} bibi! 的贡献。为什么呢?考虑将置换 ( 1 , 2 , 3 ⋯   , n a 1 , a 2 , a 3 ⋯ a n ) \begin{pmatrix} 1,2,3 \cdots,n \\ a_1,a_2,a_3 \cdots a_n \end{pmatrix} (1,2,3,na1,a2,a3an) 看做一个形如 1 → a 1 → a a 1 → a a a 1 ⋯ 1 \to a_1 \to a_{a_1} \to a_{a_{a_1}} \cdots 1a1aa1aaa1 的环排列。由于长度为 b i b_i bi 的环排列有 b i ! b i \dfrac {b_i!} {b_i} bibi! 种,所以对应的置换就有 b i ! b i \dfrac {b_i!} {b_i} bibi! 种。

最后是最容易漏的一步:当 b x = b y b_x=b_y bx=by 时,将第 x x x 个置换与第 y y y 个置换对调后对应的图依然同构。令 v v v b b b 的桶 ( v i = ∑ j = 1 m [ b j = i ] v_i=\sum_{j=1}^m [b_j=i] vi=j=1m[bj=i]),那么当前计算的值还要除以 ∏ i = 1 n v i ! \prod_{i=1}^n v_i! i=1nvi!

综上所述:

a n s = 1 n ! ∑ b m f ( b ) × g ( b ) ans=\frac 1 {n!}\sum_b m^{f(b)} \times g(b) ans=n!1bmf(b)×g(b)

a n s = 1 n ! ∑ b ( n ! ∏ i = 1 m b i ! b i ∏ i = 1 m b i ! ∏ i = 1 n v i ! ) m f ( b ) ans=\frac 1 {n!}\sum_b (\dfrac {n! \prod_{i=1}^m \frac {b_i!} {b_i}} {\prod_{i=1}^m b_i! \prod_{i=1}^n v_i!}) m^{f(b)} ans=n!1b(i=1mbi!i=1nvi!n!i=1mbibi!)mf(b)

a n s = ∑ b m f ( b ) ∏ i = 1 m b i ∏ i = 1 n v i ! ans=\sum_b \dfrac {m^{f(b)}} {\prod_{i=1}^m b_i \prod_{i=1}^n v_i!} ans=bi=1mbii=1nvi!mf(b)

时间复杂度证明

时间复杂度为 O ( n × P ( n ) ) O(n \times P(n)) O(n×P(n)) ,这里 P ( n ) P(n) P(n) 表示将 n n n 拆分为一个不下降序列之和的方案数。

P ( n ) P(n) P(n) 似乎很大的样子 ⋯ ⋯ \cdots \cdots 但是通过计算,你会发现

P ( 53 ) = 329931 \huge P(53)=329931 P(53)=329931

于是就可以轻松通过了。

如果你想要拿到最优解,请加上下面的几个剪枝:

①在 d f s dfs dfs 的时候实时维护当前答案;
②注意到在算 f f f 的时候需要用到 gcd ⁡ \gcd gcd ,我们可以 O ( n 2 log ⁡ n ) O(n^2 \log n) O(n2logn) 地预处理出每一对 1 ≤ i ≤ n , 1 ≤ j ≤ n 1 \le i \le n,1 \le j \le n 1in,1jn ( i , j ) (i,j) (i,j) gcd ⁡ \gcd gcd ,需要的时候直接 O ( 1 ) O(1) O(1) 调用;
③使用 O2/O3 优化;
④略微卡常。

Summary

核心在于 f ( b ) f(b) f(b) 的计算与 g ( b ) g(b) g(b) 的计算,而我们通过置换的性质,巧妙、快速地算出了这两个值。

本题是 Polya 定理的灵活应用题,同时也涉及到了剪枝与时间复杂度的估计,可以说是一道清新,小码量,大思维,小式子,大难度的好题。

最后放上粉兔对本题的评价:

计数好题,原来是 13 年前就出现了经典套路啊。这题在当年应该很难吧。

——小粉兔

T9

Description

给定 n , a n,a n,a ,有一个长度为 n n n 的珍珠项链,每个珍珠上有 3 3 3 个数字,每个数字不超过 a a a 。两个珍珠本质相同,当且仅当对这个珍珠上的数字重排之后可以互相得到。

求存在多少个本质不同的项链,使得任意两个相邻的珍珠不同。

两个项链不同当且仅当它们不循环同构。

Solution

套路题。

首先,我们考虑求出存在多少个不同的珍珠。令
f ( x , t ) = ∑ a 1 = 1 x ∑ a 2 = 1 x ⋯ ∑ a t = 1 x [ gcd ⁡ ( a 1 , a 2 ⋯ a t ) = 1 ] f(x,t)=\sum_{a_1=1}^x \sum_{a_2=1}^x \cdots \sum_{a_t=1}^x [\gcd(a_1,a_2 \cdots a_t)=1] f(x,t)=a1=1xa2=1xat=1x[gcd(a1,a2at)=1]

则根据 Burnside 引理,不难得到
v = 1 3 ! ∑ i = 0 3 [ 3 i ] f ( x , i ) v=\frac 1 {3!}\sum_{i=0}^3 \begin{bmatrix} 3 \\ i\end{bmatrix} f(x,i) v=3!1i=03[3i]f(x,i)

这里的 v v v 表示不同珍珠的数量, [ 3 i ] \begin{bmatrix} 3 \\ i\end{bmatrix} [3i] 是第一类斯特林数。

从而
v = f ( x , 3 ) + 3 f ( x , 2 ) + 2 f ( x , 1 ) 6 v=\frac {f(x,3)+3f(x,2)+2f(x,1)} 6 v=6f(x,3)+3f(x,2)+2f(x,1)

我们通过莫反可以轻松求出 f ( x , 3 ) , f ( x , 2 ) f(x,3),f(x,2) f(x,3),f(x,2) 。注意 f ( x , 1 ) = 1 f(x,1)=1 f(x,1)=1

求出了不同珍珠的数量之后,我们再次使用 Burnside 引理:

∑ i = 1 n g ( gcd ⁡ ( i , n ) ) \sum_{i=1}^n g(\gcd(i,n)) i=1ng(gcd(i,n))

= ∑ k ∣ n g ( k ) φ ( n k ) =\sum_{k|n} g(k) \varphi(\frac n k) =kng(k)φ(kn)

g ( k ) g(k) g(k) 表示循环节长度为 k k k 的,满足题目要求的珍珠的数量。

考虑到 g ( k ) g(k) g(k) 实际上是一个长度为 k k k 的环,每个位置都有 v v v 种可以染的颜色,且相邻的位置的颜色不同。

这是一个十分经典的环染色问题,直接套公式即可。令 A ( n , m ) A(n,m) A(n,m) 表示长度为 n n n 且用 m m m 种颜色的方案数:

A ( n , m ) = ( m − 1 ) n + ( m − 1 ) ( − 1 ) n A(n,m)=(m-1)^n + (m-1)(-1)^n A(n,m)=(m1)n+(m1)(1)n

我们找到 n n n 质因数分解,然后通过一遍 d f s dfs dfs 求出每个因数的 φ \varphi φ ,从而可以高效地求出答案。

注意,本题的 n > p n>p n>p p p p 为模数),所以我们需要用 n n n p × p p \times p p×p 取模;最后再去模 p p p

T10

Description

将一个长度为 n n n 的环染成黑白两色,要求:

恰有 m m m 个黑格与 n − m n-m nm 个白格;
②环上不存在一段连续的,长度超过 k k k 的黑色段;

请你求出存在多少个不同的染色方案。

注意,两个环不同,当且仅当这两个环不循环同构

1 ≤ n , k ≤ 1 0 5 1 \le n,k \le 10^5 1n,k105

Solution

令群 G G G 包含了所有由单位元 ( 1 , 2 , 3 … n 1 , 2 , 3 … n ) \begin {pmatrix} 1,2,3 \dots n \\ 1,2,3 \dots n \end{pmatrix} (1,2,3n1,2,3n) 循环平移得到的置换。

也就是说,群 G G G 中除了单位元,还有 ( 1 , 2 , 3 … n 2 , 3 , 4 … 1 ) \begin {pmatrix} 1,2,3 \dots n \\ 2,3,4 \dots 1 \end{pmatrix} (1,2,3n2,3,41)

( 1 , 2 , 3 … n 3 , 4 , 5 … 2 ) \begin {pmatrix} 1,2,3 \dots n \\ 3,4,5 \dots 2 \end{pmatrix} (1,2,3n3,4,52)

⋯ ⋯ \cdots \cdots

F ( g ) F(g) F(g) 表示,存在多少种合法的染色方案使得它在 g g g 的作用下保持不变。根据 Burnside 引理,有
a n s = 1 ∣ G ∣ ∑ g ∈ G F ( g ) ans=\frac {1} {|G|} \sum_{g \in G} F(g) ans=G1gGF(g)

f ( x ) f(x) f(x) 表示,存在多少种染色方案,使得其循环节长度 x x x 且满足题目中的两个要求。不难得到:

a n s   =   1 n ∑ i = 1 n f ( gcd ⁡ ( n , i ) ) ans \ = \ \frac 1 n \sum_{i=1}^n f(\gcd(n,i)) ans = n1i=1nf(gcd(n,i))

前面的 1 n \frac 1 n n1 非常好求,我们暂且忽略它。关键在于后面的那个 ∑ \sum 的计算。我们套路地枚举 gcd ⁡ ( n , i ) = x \gcd(n,i)=x gcd(n,i)=x

∑ x ∣ n f ( x ) ∑ i = 1 n [ gcd ⁡ ( n , i ) = x ] \sum_{x|n} f(x) \sum_{i=1}^n [\gcd(n,i)=x] xnf(x)i=1n[gcd(n,i)=x]

= ∑ x ∣ n f ( x ) ∑ i = 1 n x [ gcd ⁡ ( n x , i ) = 1 ] =\sum_{x|n} f(x) \sum_{i=1}^{\frac n x} [\gcd(\frac n x,i)=1] =xnf(x)i=1xn[gcd(xn,i)=1]

= ∑ x ∣ n f ( x ) φ ( n x ) =\sum_{x|n} f(x) \varphi(\frac n x) =xnf(x)φ(xn)

φ \varphi φ 函数可以通过线性筛预处理出来,于是现在关键在于计算 f ( x ) f(x) f(x)


由于确定了第一个循环节就足以确定整个串,所以我们仅考虑第一个循环节。第一个循环节的长度显然为 x x x

在这里插入图片描述
于是 f ( x ) f(x) f(x) 的实际意义为,满足下面两个限制的环状染色方案数:

①恰有 m x n \frac {mx} {n} nmx 个黑色的格子,剩下的 x − m x n x-\frac {mx} {n} xnmx 个格子为白;
②在这个环上不存在一段连续的,长度超过 k k k 的黑色段。

注意,之所以这里的第一个循环节必须被认作一个,是因为第一个循环节与第二个循环节的交界处,第 x x x 个格子与第 1 1 1 个格子相邻。


在思考如何处理 f ( x ) f(x) f(x) 之前,我们先考虑一个较为简单的问题。

A ( x , t , k ) A(x,t,k) A(x,t,k) 表示,存在多少种给长度为 x x x黑白染色的方案,使得其恰好有 t t t白色的格子,不存在一段连续的长度超过 k k k 的黑色段且首尾两个格子为白

考虑如何计算 A ( x , t , k ) A(x,t,k) A(x,t,k) 。本质上,我们需要在 t t t 个白格的 t − 1 t-1 t1空隙中插入黑色的格子,且同一个空隙中插入的黑格数量不能超过 k k k 。于是现在问题转化为:求有多少种将 x − t x-t xt 拆分为 t − 1 t-1 t1 个自然数之和的方案,要求每个自然数不超过 k k k

考虑容斥。我们钦定 c n t cnt cnt 个超过 k k k 的数,并枚举这个 c n t cnt cnt 。我们先在 t − 1 t-1 t1 个位置中选择这样的 c n t cnt cnt 个,然后在这些位置上各放上 k + 1 k+1 k+1 1 1 1 ;此时我们要将剩下的 x − t − ( k + 1 ) × c n t x-t-(k+1) \times cnt xt(k+1)×cnt 拆分为 t − 1 t-1 t1 个自然数之和,直接插板法即可。

形式化地说,

A ( x , t , k ) = ∑ c n t = 0 ⌊ x k ⌋ ( − 1 ) t ( t − 1 c n t ) P ( x − t − c n t ( k + 1 ) ,   t − 1 ) A(x,t,k)=\sum_{cnt=0}^{\lfloor \frac x k \rfloor} (-1)^t{t-1 \choose cnt} P(x-t-cnt(k+1), \ t-1) A(x,t,k)=cnt=0kx(1)t(cntt1)P(xtcnt(k+1), t1)

于是我们完成了 A ( x , t , k ) A(x,t,k) A(x,t,k) 的计算,单次时间复杂度为 O ( x k ) O(\frac x k) O(kx)

接下来考虑计算 f ( x ) f(x) f(x) 。注意, f f f A A A 唯一的区别在于,这是一个而非一条。于是,我们套路地断环为链(在首尾两处断开),枚举开头与结尾的的黑格数量。令这个值为 w w w ,那么答案需要累加 A ( x − w , x − m x n , k ) × ( w + 1 ) A(x-w,x-\frac {mx} n,k) \times (w+1) A(xw,xnmx,k)×(w+1) 。这里的 A ( x − w , x − m x n , k ) A(x-w,x-\frac {mx} {n},k) A(xw,xnmx,k) 表示将剩下的 x − w x-w xw 个格子染色的方案数, w + 1 w+1 w+1 表示将 w w w 拆分为两个自然数之和的方案数。注意,对于一种形如 w = u + v w=u+v w=u+v 的拆分方案,其实际意义为,在链的开头 u u u 个黑格并在链的尾端 v v v 个黑格。

形式化地说,

f ( x ) = ∑ w = 0 x A ( x − w , x − m x n , k ) × ( w + 1 ) f(x)=\sum_{w=0}^x A(x-w,x-\frac {mx} {n},k) \times (w+1) f(x)=w=0xA(xw,xnmx,k)×(w+1)

由于单次计算 A A A 的代价为 O ( n k ) O(\frac n k) O(kn) ,所以单次计算 f f f 的代价为 O ( k × x k ) = O ( x ) O(k \times \frac x k)=O(x) O(k×kx)=O(x)

由于答案的式子为

a n s = ∑ i ∣ n f ( i ) φ ( n i ) ans=\sum_{i|n} f(i) \varphi(\frac n i) ans=inf(i)φ(in)

所以时间复杂度为 O ( ∑ i ∣ n i ) O(\sum_{i|n} i) O(ini)

由于 n n n 的约数个数为 n \sqrt n n 级别,所以约数之和是 n n n \sqrt n nn 级别,于是总时间复杂度为
O ( n n ) O(n \sqrt n) O(nn )

本题被完美解决。

Summary

理一遍思路。

首先,看到循环同构,无脑莽上个 Burnside 引理。
然后,发现不动点是一个循环串,于是我们只考虑第一个循环串。
再然后,我们断环为链,然后用容斥 + 插板法乱搞。
紧接着,我们算出了时间复杂度,发现能过。
最后,你切掉了这题。

可以说这是一道不折不扣的套路题,唯一的难点在于容斥。笔者当时并没有想到容斥,然后就在那里死磕了半天也没想出来,最后看了题解才恍然大悟。

值得一提的是,本题似乎还有时间复杂度更优的多项式做法,但是难度过大,常数也很大,实际上并没有上述做法跑得快。

扩展练习题

洛谷P4708画画

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值