整理的算法模板合集: ACM模板

点我看算法全家桶系列!!!

实际上是一个全新的精炼模板整合计划


小学生都能看懂系列,小学生:我太难了

  群论、置换、Bunrnside引理、Pόlya定理等概念是群论的内容,也是《组合数学》第十四章Pόlya计数的内容(一般认为组合数学属于离散数学hhh),更加详细的概念以及具体的证明参见《离散数学》或者《组合数学》。这里我参考的是机械工业出版社翻译出版的原书第5版《组合数学》。


  由于时间,篇幅等限制,我这里只会简单列举一些重要性质定理概念以及竞赛中常考的一些用法,精选例题 ,实际上群论等相关定理在算法竞赛中常常用来解决一些计数问题,并且一般都是直接拿去使用的,常用的有 Bunrnside 引理、 polya 定理等等
  实际上群论里绝大多数概念、证明什么的一点都不了解也对于我们做题没有任何影响,这里涉及的很多概念、证明都不用强求,简单理解就好 ~ 都不会太难,小学二年级都能看懂,嘿嘿嘿。

目录

  • 0x00 群的定义
  • 0x10 置换
    • 0x11 置换
    • 0x12 置换的乘法
    • 0x13 置换的循环与对换
    • 0x14 置换群
  • 0x20 Burnside引理与Polya定理
    • 0x21 Burnside引理
      • 0x21.1 Burnside引理
      • 0x21.2Burnside 引理的证明
    • 0x22 Polya 定理
    • 0x23 特殊模型
      • 0x23.1 旋转同构
      • 0x23.2 对称同构
    • 0x24 Burnside引理与Polya定理的抉择
      • 0x24.1 可以使用Polya定理
      • 0x24.2 只能使用Burnside引理
  • 0x30 竞赛例题选讲

0x00 群的定义

  给定一个集合 G = { a , b , c , . . . } G = \{a,b,c,...\} G={a,b,c,...} 和集合上的二元运算 “ ∗ * ∗”,如果满足以下条件:

(1)封闭性。对于任意的 a , b ∈ G , a ∗ b ∈ G a,b\in G,a*b \in G a,b∈G,a∗b∈G 成立。

(2)结合律。对于任意 a , b , c ∈ G , a ∗ ( b ∗ c ) = ( a ∗ b ) ∗ c a,b,c \in G,a*(b*c) = (a*b)*c a,b,c∈G,a∗(b∗c)=(a∗b)∗c 成立。

(3)存在单位元。G 中存在一个元素 e e e,使得对于 G 中任意元素 a a a ,都有 a ∗ e = e ∗ a = a a*e = e*a = a a∗e=e∗a=a,元素 e e e 为单位元素。

(4)存在逆元。对于 G 中任意元素 a a a ,恒有一个 b ∈ G b\in G b∈G ,使得 a ∗ b = b ∗ a = e a*b= b*a = e a∗b=b∗a=e,则元素 b b b 为元素 a a a 的逆元,记作 a − 1 a^{-1} a−1.

  则称集合 G 是运算 “ ∗ * ∗” 下的一个群,记为 ( G , ∗ ) (G,*) (G,∗) 若 G 是一个有限集,则称 ( G , ∗ ) (G,*) (G,∗) 为有限群,其中有限群元素个数成为有限群的阶。记作 ∣ G ∣ |G| ∣G∣ ;若 G 是无限集,则称 ( G , ∗ ) (G,*) (G,∗) 是无限群。

如果群G中任意两个元素a,b满足交换律,则该群为Abel群。

子群

  设 G 在 “ ∗ * ∗” 下是一个群,若 H 是 G 的非空子集且 H 在 “ ∗ * ∗” 运算下也是一个群,则称 ( H , ∗ ) (H,*) (H,∗) 是 ( G , ∗ ) (G,*) (G,∗) 的子群。

0x10 置换

0x11 置换

  置换,就是一个 1 1 1~ n n n 的排列,是一个 1 1 1~ n n n 排列对 1 1 1 ~ n n n 的映射。其实置换就是给我们一个 n n n 个数的排列 1 , 2 , ⋯ n 1,2,\cdots n 1,2,⋯n ,我们通过置换得到 1 1 1 ~ n n n 的映射 p 1 , p 2 , p 3 ⋯ p n p_1,p_2,p_3\cdots p_n p1​,p2​,p3​⋯pn​

它们一一对应: ( 1 2 3 . . . n p 1 p 2 p 3 . . . p n ) \binom{1\ 2\ 3\ ...n}{p_{1}\ p_{2} \ p_{3} ...p_{n}} (p1​ p2​ p3​...pn​1 2 3 ...n​)

表示元素 1 1 1 被 1 1 1 到 n n n 的某个数 p 1 p_1 p1​取代, 2 2 2 被 1 1 1 到 n n n的某个除 p 1 p_1 p1​ 以外的数 p 2 p_2 p2​ 取代 ⋯ n \cdots n ⋯n被 1 1 1到 n n n 中除 p 1 , p 2 , p 3 , ⋯ , p n − 1 p_1,p_2,p_3,\cdots,p_{n-1} p1​,p2​,p3​,⋯,pn−1​ 的数 p n p_n pn​取代。

也可以将置换看作是一个函数 f ( x ) f(x) f(x) ,其中 f ( 1 ) = p 1 f(1) =p_1 f(1)=p1​ , f ( 2 ) = p 2 f(2)=p_2 f(2)=p2​ ⋯ \cdots ⋯ f ( n ) = p n f(n)=p_n f(n)=pn​。

其中 p 1 , p 2 , ⋯ , p n p_1,p_2,\cdots,p_n p1​,p2​,⋯,pn​ 仍然是 1 1 1 ~ n n n 的一个排列,所以很明显不同的置换一共有 n ! n! n! 种 ,因为所有排列有一共 n ! n! n! 种选择方式。

0x12 置换的乘法

我们发现置换实际上就表示为元素位置的变化

例如给定一个四元置换:

序列 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4 经过该四元置换以后,变成了 3 , 2 , 4 , 1 3,2,4,1 3,2,4,1

即: ( 1 2 3 4 3 2 4 1 ) \binom{1\ 2\ 3\ 4\ }{3\ 2 \ 4 \ 1} (3 2 4 11 2 3 4 ​)

若我们对 3 , 2 , 4 , 1 3,2,4,1 3,2,4,1 再进行一次上述置换(同样的位置映射)就得到了 4 , 2 , 1 , 3 4,2,1,3 4,2,1,3。

置换实际上就表示元素的变化,因此就有置换的乘法

P 1 = ( 1 2 3 4 a 1 a 2 a 3 a 4 ) P 2 = ( a 1 a 2 a 3 a 4 b 1 b 2 b 3 b 4 ) P_{1} = \binom{1\ \ \ 2\ \ 3\ \ \ 4\ }{a_{1}\ a_{2} \ a_{3} \ a_{4}} \ \ P_{2} = \binom{a_{1}\ a_{2} \ a_{3} \ a_{4}}{b_{1}\ b_{2} \ b_{3} \ b_{4}} P1​=(a1​ a2​ a3​ a4​1   2  3   4 ​)  P2​=(b1​ b2​ b3​ b4​a1​ a2​ a3​ a4​​)

则 P 1 ∗ P 2 = ( 1 2 3 4 b 1 b 2 b 3 b 4 ) P_{1}*P_{2} = \binom{1\ \ \ 2\ \ 3\ \ \ 4\ }{b_{1}\ b_{2} \ b_{3} \ b_{4}} P1​∗P2​=(b1​ b2​ b3​ b4​1   2  3   4 ​)

很明显置换并不支持交换律。


  正如置换可以看作是一个函数,那么置换的乘积就可以看作是一个复合函数(就是疯狂置换,我们所了解的乘积实际上就是很多个加嘛,就是多次置换…)

0x13 置换的循环与对换

  循环是表示置换的一种方法,能反映置换的结构,且便于运算。因此我们把 m m m 阶循环记为

( a 1 a 2 . . . a m − 1 a m a 2 a 3 . . . a m a 1 ) \binom{a_{1}\ a_{2} ...\ a_{m-1} \ a_{m}}{a_{2}\ a_{3} ...\ a_{m} \ a_{1}} (a2​ a3​... am​ a1​a1​ a2​... am−1​ am​​)

特别的,当 m = 2 m= 2 m=2 时, 2 2 2 阶循环 ( i , j ) (i,j) (i,j) 叫做 i i i 和 j j j 的对换或换位。(很形象,不解释)

不相交的: 如果两个循环没有公共元素,则称这两个循环是不相交的。

定理13.1: 任何一个置换都可以分解为若干个互不相交的循环置换的乘积,且表示法是唯一的。

即:

( a 1 , a 2 , a 3 , a 4 , a 5 a 3 , a 1 , a 2 , a 5 , a 4 ) = ( a 1 , a 3 , a 2 ) ∘ ( a 4 , a 5 ) \begin{pmatrix}a_1,a_2,a_3,a_4,a_5\\ a_3,a_1,a_2,a_5,a_4\end{pmatrix}=(a_1,a_3,a_2)\circ(a_4,a_5) (a1​,a2​,a3​,a4​,a5​a3​,a1​,a2​,a5​,a4​​)=(a1​,a3​,a2​)∘(a4​,a5​)

如果把元素视为图的节点,映射关系视为有向边,则每个节点的入度和出度都为 1,因此形成的图形必定是若干个环的集合,而一个环即可用一个循环置换表示。

推论13.2: 任何一个置换都可以表示成若干个对换的乘积。因为任何一个循环都可以表示成若干个对换的乘积。

稳定核: 设 G = { g 1 , g 2 , ⋯ , g t } G=\{g_1,g_2,\cdots,g_t\} G={g1​,g2​,⋯,gt​} 是 S n S_n Sn​ 的子群,若 k k k 是 1 ∼ n 1\sim n 1∼n 中的某个整数, G G G 中使数 k k k 固定不变的置换全体所构成的集合,称为数 k k k 在 G G G 下的稳定核,或称 G G G 中使数 k k k 固定不变的置换群,记为 Z k Z_k Zk​ 。 g i ( 1 ≤ i ≤ t ) g_i(1\le i\le t) gi​(1≤i≤t) 中不变元的个数记为 λ 1 ( g i ) \lambda_1(g_i) λ1​(gi​) 。

Example 13.3 : 置换 ( a 1 a 2 a 3 a 4 ⋯ a m ) (a_1\ a_2\ a_3\ a_4\ \cdots a_m) (a1​ a2​ a3​ a4​ ⋯am​):

( a 1 a 2 a 3 a 4 ⋯ a m ) = ( a 1 a 2 ) ( a 2 a 3 ) ( a 3 a 4 ) ⋯ ( a d − 1 a d ) (a_1\ a_2\ a_3\ a_4\ \cdots a_m) =(a_1\ a_2)(\ a_2 \ a_3) (\ a_3 \ a_4)\cdots (\ a_d-1\ a_d) (a1​ a2​ a3​ a4​ ⋯am​)=(a1​ a2​)( a2​ a3​)( a3​ a4​)⋯( ad​−1 ad​)

0x14 置换群

  一个置换规定为一种变换法则,将集合中的一些元素映射成另一些元素。

  一般可以认为 “元素” 是一个数组 { a i } \{a_i\} {ai​},对这个数组的变换(如交换某两个元素,翻转等等)就是置换,置换群就是一个置换的集合加上一个 “叠加” 运算(就是两个置换一次操作)。

  在置换群的作用下,元素存在等价关系。等价关系即满足自反性对称性传递性。满足等价关系的元素处于同一个等价类中。

置换群的子集同样是一个置换群。

0x20 Burnside引理与Polya定理

有了上面的这些基础知识,我们就可以引入 Burnside 引理了

0x21 Burnside引理

0x21.1 Burnside引理

  下面先给出一些不理解也无伤大雅的一些概念,群论里实际上绝大多数概念、证明一点都不了解也对于我们做题没有任何影响,所以这里不用强求。

  • 不动点: 不动点 c ( a i ) c(a_i) c(ai​) :若某元素在置换 a i a_i ai​ 下不改变,则成它为置换 a i a_i ai​ 的不动点。

  • 元素轨道 E k E_k Ek​(等价类): 一个元素经过置换能得到的所有元素集合(这里元素可以看做一个点,置换可以看作走一条边,轨道就是能走到的所有点的集合)。

  • 稳定化子 Z k Z_k Zk​ : 使操作后这个元素不变的置换集合(即这个元素是此集合内所有置换的不动点)。

  • 拉格朗日定理: 一个有限群的子群的元素个数必能整除这个群的元素个数。

  • 轨道-稳定化子定理: ∣ E k ∣ ∗ ∣ Z k ∣ = G |E_k|*|Z_k|=G ∣Ek​∣∗∣Zk​∣=G

由上式即可推出

定理21.1.1:《组合数学》中的 Burnside 引理

  设 G G G 是 X X X 的置换群,而 C C C 是 X X X 中一个满足下面条件的着色集合:对于 G G G 中所有的 f f f 和 C C C 中所有的 c c c 都有 f ∗ c f*c f∗c 仍在 C C C 中,则 C C C 中非等价着色数 N ( G , C ) N(G,C) N(G,C) 由下式给出:

N ( G , C ) = 1 ∣ G ∣ ∑ f ∈ G ∣ C ( f ) ∣ N(G,C)=\frac{1}{|G|}\sum_{f\in G}|C(f)| N(G,C)=∣G∣1​f∈G∑​∣C(f)∣

换言之, C C C 中非等价的着色数等于在 G G G 中置换作用下保持不变的着色的平均数。

简化一下:

对于一个置换 f f f ,若一个元素 s s s 经过 f f f 后不变,则称 s s s 为 f f f 的不动点。

记 f f f 的不动点个数为 C ( f ) C(f) C(f),则对于一个置换群,等价类个数为所有 C ( f ) C(f) C(f) 的平均值。

再简化一下:

一个置换群的等价类的个数等于各置换不动点个数的平均值。

说人话:

每个置换的不动点的个数的平均值就是不同的方案数

Example 21.1 : 【经典例题 1 】

  如图 21.1.1 所示, 2 × 2 2×2 2×2 方格中每个格子可以选择染上 2 2 2 种颜色(红色或白色)。那么总共是 2 4 = 16 2^4=16 24=16 种情况。现在要问,如果 不旋转、顺时针旋转 90 90 90 度、逆时针旋转 90 90 90 度、旋转 180 180 180 度后相同的均算成同一种方案,问总共有多少种不同的方案。

图 21.1.1

Solution

我们将每种旋转认为是一种 “置换” ,定义为 f i f_i fi​,根据上面的描述我们一共有四种置换, f 1 f_1 f1​ ~ f 4 f_4 f4​。

f 1 f_1 f1​ = = = < < <旋转 0 ° 0° 0° > > >
f 1 f_1 f1​ = = = < < <顺时针旋转 90 ° 90° 90° > > >
f 1 f_1 f1​ = = = < < <逆时针旋转 90 ° 90° 90° > > >
f 1 f_1 f1​ = = = < < <旋转 180 ° 180° 180° > > >

我们根据上面的定义,设 C ( f i ) C(f_i) C(fi​) 来表示 f i f_i fi​ 的这个置换下的不动点集合(经过该置换以后不改变状态)

C ( f i ) C(f_i) C(fi​) 表示不动点个数。

则可以得到:

C ( f 1 ) = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 } C(f_1) = \{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16\} C(f1​)={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}

C ( f 2 ) = { 1 , 2 } C(f_2) = \{1,2 \} C(f2​)={1,2}

C ( f 3 ) = { 1 , 2 } C(f_3) = \{1,2 \} C(f3​)={1,2}

C ( f 4 ) = { 1 , 2 , 11 , 12 } C(f_4) = \{1,2,11,12\} C(f4​)={1,2,11,12}

然后根据上面我们给出的 Burnside 引理 公式:

N ( G , C ) = 1 ∣ G ∣ ∑ f ∈ G ∣ C ( f i ) ∣ N(G,C)=\frac{1}{|G|}\sum_{f\in G}|C(f_i)| N(G,C)=∣G∣1​f∈G∑​∣C(fi​)∣

其中 ∣ C ( f i ) ∣ |C(f_i)| ∣C(fi​)∣ 表示不动点集合 C ( f i ) C(f_i) C(fi​) 的个数。

N N N 表示 使用 m m m 种颜色给 n n n 个对象染色的总方案数

∣ G ∣ |G| ∣G∣代表置换个数

得到 N = 16 + 2 + 2 + 4 4 = 6 N=\cfrac{16+2+2+4}{4}=6 N=416+2+2+4​=6


Example 21.2:【经典例题 2 】

  如图 21.1.2 所示,一个 3 × 3 3×3 3×3的方格,用 10 10 10 种颜色给每个格子染色,旋转 0 0 0 度、顺时针旋转 90 90 90 度、旋转 180 180 180 度、逆时针旋转 90 90 90 度后,相同的均算成同一种方案,问总共有多少种不同的方案。

图 21.1.2

  我们给每一个格子编一个号,因为每个格子一共有 10 10 10 种颜色可供选择,总共 9 9 9 个格子,总方案数为 1 0 9 10^9 109。我们使用 Burnside 引理, ∣ C ( f i ) ∣ |C(f_i)| ∣C(fi​)∣ 代表在 f i f_i fi​ 这种置换作用下不动点(没有改变状态)的方案个数,置换总共四种,那么我们将这四种置换都列出来:

1)旋转 0 0 0 度:也就是我们将这个 3 × 3 3×3 3×3 的方格旋转 0 0 0 度后,有多少种方案是没有改变状态的,答案显然是 1 0 9 10^9 109 。也就是说,无论你哪个格子染成什么颜色都没关系,旋转 0 0 0 度前后状态不变.

2)顺时针旋转 90 90 90 度:我们发现 ①③⑨⑦ 循环变换、 ②④⑧⑥ 循环变换,而 ⑤ 是永远不变。表示成置换群的乘积就是 ( 1397 ) ( 2486 ) ( 5 ) (1397)(2486)(5) (1397)(2486)(5) 。那么我们发现,只要在同一个循环中的格子颜色一致,则在这种置换下状态永远不会改变。所以 ( 1397 ) (1397) (1397) 可以取 10 10 10 种颜色、 ( 2486 ) (2486) (2486) 同样也可以取 10 10 10 种颜色、 ( 5 ) (5) (5) 可以取 10 10 10 种颜色,总方案数为 1 0 3 10^3 103。

3)旋转 180 180 180 度:置换群为 ( 19 ) ( 28 ) ( 37 ) ( 46 ) ( 5 ) (19)(28)(37)(46)(5) (19)(28)(37)(46)(5)(可以看作旋转之后 ① 和 ⑨ 交换等等),总方案数为 1 0 5 10^5 105。

4)逆时针旋转 90 90 90 度:类似顺时针旋转 90 90 90 度,总方案数为 1 0 3 10^3 103。

所以根据Burnside引理公式:

N ( G , C ) = 1 ∣ G ∣ ∑ f ∈ G ∣ C ( f i ) ∣ N(G,C)=\frac{1}{|G|}\sum_{f\in G}|C(f_i)| N(G,C)=∣G∣1​f∈G∑​∣C(fi​)∣

可得总方案数为:

N = 1 0 9 + 1 0 3 + 1 0 5 + 1 0 3 4 N = \cfrac{10^9 + 10^3 + 10^5 + 10^3}{4} N=4109+103+105+103​

0x21.2Burnside 引理的证明

建议跳过()

该段证明来源


轨道稳定子定理 G G G 和 X X X 的定义同上, ∀ x ∈ X , G x = { g ∣ g ( x ) = x , g ∈ G } , G ( x ) = { g ( x ) ∣ g ∈ G } \forall x\in X,G^x=\{g|g(x)=x,g\in G\},G(x)=\{g(x)|g\in G\} ∀x∈X,Gx={g∣g(x)=x,g∈G},G(x)={g(x)∣g∈G},其中 G x G^x Gx 称为 x x x 的 稳定子, G ( x ) G(x) G(x) 称为 x x x 的 轨道,则有

∣ G ∣ = ∣ G x ∣ ∣ G ( x ) ∣ |G|=|G^x||G(x)| ∣G∣=∣Gx∣∣G(x)∣

轨道稳定子定理的证明 首先可以证明 G x G^x Gx 是 G G G 的子群,因为

  • 封闭性:若 f , g ∈ G f,g\in G f,g∈G,则 f ∘ g ( x ) = f ( g ( x ) ) = f ( x ) = x f\circ g(x)=f(g(x))=f(x)=x f∘g(x)=f(g(x))=f(x)=x,所以 f ∘ g ∈ G x f\circ g\in G^x f∘g∈Gx

  • 结合律:显然置换的乘法满足结合律

  • 单位元:因为 I ( x ) = x I(x)=x I(x)=x,所以 I ∈ G x I\in G^x I∈Gx( I I I 为恒等置换)

  • 逆元:若 g ∈ G x g\in G^x g∈Gx,则 g − 1 ( x ) = g − 1 ( g ( x ) ) = g − 1 ∘ g ( x ) = I ( x ) = x g^{-1}(x)=g^{-1}(g(x))=g^{-1}\circ g(x)=I(x)=x g−1(x)=g−1(g(x))=g−1∘g(x)=I(x)=x,所以 g − 1 ∈ G x g^{-1}\in G^x g−1∈Gx

由群论中的拉格朗日定理,可得

∣ G ∣ = ∣ G x ∣ [ G : G x ] |G|=|G^x|[G:G^x] ∣G∣=∣Gx∣[G:Gx]

其中 [ G : G x ] [G:G^x] [G:Gx] 为 G x G^x Gx 不同的左陪集个数。接下来只需证明 ∣ G ( x ) ∣ = [ G : G x ] |G(x)|=[G:G^x] ∣G(x)∣=[G:Gx],我们将其转化为证明存在一个从 G ( x ) G(x) G(x) 到 G x G^x Gx 所有不同左陪集的双射。令 φ ( g ( x ) ) = g G x \varphi(g(x))=gG^x φ(g(x))=gGx,下证 φ \varphi φ 为双射

  • 若 g ( x ) = f ( x ) g(x)=f(x) g(x)=f(x),两边同时左乘 f − 1 f^{-1} f−1,可得 f − 1 ∘ g ( x ) = I ( x ) = x f^{-1}\circ g(x)=I(x)=x f−1∘g(x)=I(x)=x,所以 f − 1 ∘ g ∈ G x f^{-1}\circ g\in G^x f−1∘g∈Gx,由陪集的性质可得 ( f − 1 ∘ g ) G x = G x (f^{-1}\circ g)G^x=G^x (f−1∘g)Gx=Gx,即 g G x = f G x gG^x=fG^x gGx=fGx

  • 反过来可证,若 g G x = f G x gG^x=fG^x gGx=fGx,则有 g ( x ) = f ( x ) g(x)=f(x) g(x)=f(x)

  • 以上两点说明对于一个 g ( x ) g(x) g(x),只有一个左陪集与其对应,即 φ \varphi φ 是一个从 G ( x ) G(x) G(x) 到左陪集的映射

  • 又显然 φ \varphi φ 有逆映射,因此 φ \varphi φ 是一个双射

    Burnside 引理的证明

∑ g ∈ G ∣ X g ∣ = ∣ { ( g , x ) ∣ ( g , x ) ∈ G × X , g ( x ) = x } ∣ = ∑ x ∈ X ∣ G x ∣ = ∑ x ∈ X ∣ G ∣ ∣ G ( x ) ∣ ( 轨 道 稳 定 子 定 理 ) = ∣ G ∣ ∑ x ∈ X 1 ∣ G ( x ) ∣ = ∣ G ∣ ∑ Y ∈ X / G ∑ x ∈ Y 1 ∣ G ( x ) ∣ = ∣ G ∣ ∑ Y ∈ X / G ∑ x ∈ Y 1 ∣ Y ∣ = ∣ G ∣ ∑ Y ∈ X / G 1 = ∣ G ∣ ∣ X / G ∣ \begin{aligned} \sum_{g\in G}|X^g|&=|\{(g,x)|(g,x)\in G\times X,g(x)=x\}|\\ &=\sum_{x\in X}|G^x|\\ &=\sum_{x\in X}\frac{|G|}{|G(x)|}\quad\quad\quad(轨道稳定子定理)\\ &=|G|\sum_{x\in X}\frac{1}{|G(x)|}\\ &=|G|\sum_{Y\in X/G}\sum_{x\in Y}\frac{1}{|G(x)|}\\ &=|G|\sum_{Y\in X/G}\sum_{x\in Y}\frac{1}{|Y|}\\ &=|G|\sum_{Y\in X/G}1\\ &=|G||X/G| \end{aligned} g∈G∑​∣Xg∣​=∣{(g,x)∣(g,x)∈G×X,g(x)=x}∣=x∈X∑​∣Gx∣=x∈X∑​∣G(x)∣∣G∣​(轨道稳定子定理)=∣G∣x∈X∑​∣G(x)∣1​=∣G∣Y∈X/G∑​x∈Y∑​∣G(x)∣1​=∣G∣Y∈X/G∑​x∈Y∑​∣Y∣1​=∣G∣Y∈X/G∑​1=∣G∣∣X/G∣​

所以有

∣ X / G ∣ = 1 ∣ G ∣ ∑ g ∈ G ∣ X g ∣ |X/G|=\frac{1}{|G|}\sum_{g\in G}|X^g| ∣X/G∣=∣G∣1​g∈G∑​∣Xg∣


0x22 Polya 定理

  我们发现如果要使用 Burnside引理 求解计数问题,还需要一个一个数不动点的个数,非常难数,若是数据非常大的话基本上就废了,因此我们引入 Polya 定理,提供了一种直接计算不动点的方法,可以快速方便地解决 Burnside引理 难以求解的问题。

我们上面介绍了任意一个置换都可以分解为循环的乘积。

这里定义 循环循环节 为循环的个数。

例如 :

循环 ( 1 2 3 4 5 3 5 1 4 2 ) = ( 1 3 ) ( 2 5 ) ( 4 ) \left( \begin{matrix} 1 & 2 & 3 & 4 & 5 \\ 3 & 5 & 1 & 4 & 2 \end{matrix} \right) = (1\ 3)(2\ 5)(4) (13​25​31​44​52​)=(1 3)(2 5)(4)(可以理解为13对应31,25对应52,4对应4)

循环 ( 1 3 ) ( 2 5 ) ( 4 ) (1\ 3)(2\ 5)(4) (1 3)(2 5)(4) 的循环节为 3 3 3 。

对于一个置换 f f f, C ( f ) = k m ( f ) C(f)=k^{m(f)} C(f)=km(f),其中 k k k 为颜色数, m ( f ) m(f) m(f) 为 f f f 的循环节。

综上,在置换群中,等价类个数(方案数)等于所有置换 f f f 的 k m ( f ) k^{m(f)} km(f) 的平均数。

简单解释一下:

  我们假设一个置换有 k k k 个循环,显然每个循环对应的所有位置颜色需一致,而任意两个循环之间选什么颜色互不影响。因此,若有 k k k 种可选颜色,则该置换 f f f 所对应的不动点个数为 k m ( f ) k^{m(f)} km(f) 。我们用它来替换掉 burnside 引理中的 C ( f ) C(f) C(f),即 C ( f ) = k m ( f ) C(f)=k^{m(f)} C(f)=km(f)。得到等价类数量(总方案数)为:

N = ∑ i = 0 ∣ G ∣ k m ( f i ) ∣ G ∣ N=\cfrac{\sum_{i=0}^{|G|}k^{m(f_i)}}{|G|} N=∣G∣∑i=0∣G∣​km(fi​)​

其中 ∣ G ∣ |G| ∣G∣ 表示置换的数目, m ( f i ) m(f_i) m(fi​) 表示第 i i i 个置换包含的循环个数。

我们继续使用最开始提出的经典例题1

Problem 22.1 : 【经典例题 1 】

  如图 22.1.1 所示, 2 × 2 2×2 2×2 方格中每个格子可以选择染上 2 2 2 种颜色(红色或白色)。那么总共是 2 4 = 16 2^4=16 24=16 种情况。现在要问,如果 不旋转、顺时针旋转 90 90 90 度、逆时针旋转 90 90 90 度、旋转 180 180 180 度后相同的均算成同一种方案,问总共有多少种不同的方案。

图 22.1.1

Solution

我们根据 Polya 定理可以得到下式:

不旋转

f 1 = ( 1 2 3 4 1 2 3 4 ) = ( 1 ) ( 2 ) ( 3 ) ( 4 ) , C ( f ) = k m ( f ) = 2 4 = 16 f_1 = \left( \begin{matrix} 1 & 2 & 3 & 4 \\ 1 & 2 & 3 & 4 \end{matrix} \right) = (1)(2)(3)(4), C(f) = k ^ {m(f)} = 2 ^ 4 = 16 f1​=(11​22​33​44​)=(1)(2)(3)(4),C(f)=km(f)=24=16

顺时针旋转 90 ° 90° 90°

f 2 = ( 1 2 3 4 2 3 4 1 ) = ( 1 2 3 4 ) , C ( f ) = k m ( f ) = 2 1 = 2 f_2 = \left( \begin{matrix} 1 & 2 & 3 & 4 \\ 2 & 3 & 4 & 1 \end{matrix} \right) = (1\ 2\ 3\ 4), C(f) = k ^ {m(f)} = 2 ^ 1 = 2 f2​=(12​23​34​41​)=(1 2 3 4),C(f)=km(f)=21=2

逆时针旋转 90 ° 90° 90°

f 3 = ( 1 2 3 4 4 1 2 3 ) = ( 1 2 3 4 ) , C ( f ) = k m ( f ) = 2 1 = 2 f_3 = \left( \begin{matrix} 1 & 2 & 3 & 4 \\ 4 & 1 & 2 & 3 \end{matrix} \right) = (1\ 2\ 3\ 4), C(f) = k ^ {m(f)} = 2 ^ 1 = 2 f3​=(14​21​32​43​)=(1 2 3 4),C(f)=km(f)=21=2

旋转 180 ° 180° 180°

f 4 = ( 1 2 3 4 3 4 1 2 ) = ( 1 3 ) ( 2 4 ) , C ( f ) = k m ( f ) = 2 2 = 4 f_4 = \left( \begin{matrix} 1 & 2 & 3 & 4 \\ 3 & 4 & 1 & 2 \end{matrix} \right) = (1\ 3)(2\ 4), C(f) = k ^ {m(f)} = 2 ^ 2 = 4 f4​=(13​24​31​42​)=(1 3)(2 4),C(f)=km(f)=22=4

这里旋转 180 ° 180° 180° 得到的循环的乘积为 ( 1 3 ) ( 2 4 ) (1\ 3)(2\ 4) (1 3)(2 4) ,即代表 1 1 1、 3 3 3 循环置换,互相变换, 2 2 2、 4 4 4 循环置换,很明显 1 1 1 和 3 3 3 的颜色必须相同, 2 2 2 和 4 4 4 的颜色也必须相同,而 1 1 1、 3 3 3 和 2 2 2、 4 4 4 的颜色互不相干,没有影响。

最后我们使用 Polya 定理 同样可以得到正确答案:

N = 16 + 2 + 2 + 4 4 = 6 N=\cfrac{16+2+2+4}{4}=6 N=416+2+2+4​=6

0x23 特殊模型

0x23.1 旋转同构

模型简述: n n n个点,每个点移动 k k k 步( 0 ≤ k ≤ n − 1 0\le k\le n-1 0≤k≤n−1),循环个数为: gcd ⁡ ( k , n ) \gcd(k,n) gcd(k,n)

证明:

  1. 当 k k k 是 n n n 的约数,显然成立。一个环用 n k \cfrac{n}{k} kn​ 个,可以分成 N ( N k ) = k \cfrac{N}{(\frac{N}{k})}=k (kN​)N​=k 个循环( g c d ( k , n ) = k gcd(k,n)=k gcd(k,n)=k)。

  2. 当 k k k 不是 N N N 的约数,最小的循环长度是: l c m ( k , n ) \text lcm(k,n) lcm(k,n),循环使用的端点是: l c m k \cfrac{\text lcm}{k} klcm​个,可以凑成 n l c m k = n × k l c m = g c d ( N , k ) \cfrac{n}{\frac{lcm}{k}}=\cfrac{n\times k}{\text lcm}=gcd(N,k) klcm​n​=lcmn×k​=gcd(N,k) 个。

Problem 23.1.1:循环同构

  我们发现经典问题实际上就相当于:圆上有 4 4 4 个点, 2 2 2 种颜色,旋转同构,求方案数。 我们来把它扩展一下:圆上有 n n n 个点, k k k 种颜色,旋转同构,求总方案数。

Solution

仔细分析可以发现,当我们旋转 i i i 个点时,一共会有 gcd ⁡ ( i , n ) \gcd(i,n) gcd(i,n) 个循环,每个循环会有 n gcd ⁡ ( i , n ) \cfrac{n}{\gcd(i,n)} gcd(i,n)n​ 个元素。

因此
a n s = 1 n ∑ i = 0 n − 1 k gcd ⁡ ( i , n ) ans=\cfrac{1}{n}\sum_{i=0}^{n-1}k^{\gcd(i,n)} ans=n1​i=0∑n−1​kgcd(i,n)

0x23.2 对称同构

Problem 23.2.1:对称同构

圆上有 n n n 个点, k k k 种颜色,旋转同构,翻转同构,求总方案数。

Solution

旋转同构总共形成 a = ∑ i = 0 n − 1 k gcd ⁡ ( i , n ) a=\sum_{i = 0}^{n-1} k^{\gcd(i,n)} a=∑i=0n−1​kgcd(i,n) 个不动点。

翻转同构分两种情况考虑:

当 n n n 为奇数时,对称轴有 n n n 条,每条对称轴形成 n − 1 2 \cfrac{n-1}{2} 2n−1​ 个长度为 2 2 2 的循环, 1 1 1 个长度为 1 1 1 的循环(对称轴一定过一个顶点),共 n − 1 2 + 1 = n + 1 2 \cfrac{n-1}{2}+1=\cfrac{n+1}{2} 2n−1​+1=2n+1​ 个循环。

因此总共形成 b = n k n + 1 2 b=nk^{\frac{n+1}{2}} b=nk2n+1​ 个不动点。

当 n n n 为偶数时,有两种对称轴。穿过两个点的对称轴有 n 2 \cfrac{n}{2} 2n​ ,共形成 n 2 + 1 \cfrac{n}{2} + 1 2n​+1 个循环;不穿过点的对称轴有 n 2 \cfrac{n}{2} 2n​ ,共形成 n 2 \cfrac{n}{2} 2n​ 个循环。

因此总共形成 b = n 2 ( k n 2 + 1 + k n 2 ) b=\cfrac{n}{2}(k^{\frac{n}{2} + 1} + k^{\frac{n}{2}}) b=2n​(k2n​+1+k2n​) 个不动点。

综上, a n s = a + b 2 n ans = \cfrac{a+b}{2n} ans=2na+b​


奇数点按边对称: n − 1 2 + 1 = n + 1 2 \cfrac{n-1}{2}+1=\cfrac{n+1}{2} 2n−1​+1=2n+1​ 个循环。

奇数点按边对称: n 2 \cfrac{n}{2} 2n​ 个循环。

按点对称: 2 + n − 2 2 = n + 2 2 2+\cfrac{n-2}{2}=\cfrac{n+2}{2} 2+2n−2​=2n+2​ 个循环。

P4980 【模板】Pólya 定理

给定一个 n n n 个点, n n n 条边的环,有 n n n 种颜色,给每个顶点染色,问有多少种本质不同的染色方案,答案对 1 0 9 + 7 10^9+7 109+7 取模

注意本题的本质不同,定义为:只需要不能通过旋转与别的染色方案相同。

n ≤ 1 0 9 n\le 10^9 n≤109

Solution

显然答案为 a n s = ∑ i = 0 n − 1 k gcd ⁡ ( i , n ) \displaystyle ans=\sum_{i=0}^{n-1}k^{\gcd(i,n)} ans=i=0∑n−1​kgcd(i,n)

但是 n ≤ 1 0 9 n\le 10^9 n≤109 数据较大,显然没办法直接暴力计算,考虑优化。

显然可以从 gcd ⁡ \gcd gcd 上入手。 设 d i = g c d ( n , i ) d_i=gcd(n,i) di​=gcd(n,i) 。显然,所有 d d d 都是 n n n 约数。设有 x x x 个 d d d 是相等的,那么可以枚举 n n n 的约数。设枚举到了第 j j j 个约数 p j p_j pj​ ,那么 d = n / p j d=n/p_j d=n/pj​ 。我们也很容易发现 x = φ ( n / d ) x=\varphi (n/d) x=φ(n/d)。所以 a n s = 1 n ∑ p ∣ n φ ( p ) × k n p ans=\frac{1}{n} \sum _{p|n} \varphi (p)\times k^{\frac {n}{p}} ans=n1​∑p∣n​φ(p)×kpn​

时间复杂度 O ( n ) O(\sqrt n) O(n ​)

Code

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5 + 7, mod = 1e9 + 7;
const double PI = acos(-1.0);int n, k;int qpow(int a, int b)
{int res = 1;while(b) {if(b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}int get_phi(int n)
{int res = 1;for(int i = 2; i * i <= n; ++ i) {if(n % i == 0) {n /= i;res = res * (i - 1);while(n % i == 0) n /= i, res = res * i;}}if(n > 1) res = res * (n - 1);return res;
}void solve()
{scanf("%lld", &n);k = n;int res = 0;for(int i = 1; i * i <= n; ++ i) {if(n % i == 0) {res = (res + get_phi(i) * qpow(k, n / i)) % mod;if(i * i != n) {res = (res + get_phi(n / i) * qpow(k, i)) % mod;}}}res = res * qpow(n, mod - 2) % mod;printf("%lld\n", res);
}signed main()
{int t;scanf("%lld", &t);while(t -- ) {solve();}return 0;
}

0x24 Burnside引理与Polya定理的抉择

  我们知道 Polya定理 使用起来会比 Burnside引理 更加方便快捷,并且可以解决 Burnside引理 很难解决的大量不动点难以计数问题。那么我们每次只需要使用 Polya定理 就好了嘛?

我们知道 Polya定理 实际上就是 Burnside引理 的延伸拓展,对于 一种特殊情况的特解方法。即若不同循环之间没有任何关联就可以直接使用 Polya定理 解决。但是如果不同循环之间有一定的联系呢?此时我们只能使用 Burnside引理 解决问题。

下面给出两个例题,一个可以用 Polya定理 快速求解,一个只能使用 Burnside引理 ,希望大家可以理解并明白这两个求解方法的使用场景。

0x24.1 可以使用Polya定理

Problem 24.1.1 AcWing 3133. 串珠子

给定 M M M 种不同颜色的珠子,每种颜色的珠子的个数都足够多。

现在要从中挑选 N N N 个珠子,串成一个环形手链。

请问一共可以制作出多少种不同的手链。

注意,如果两个手链经旋转翻转后能够完全重合在一起,对应位置的珠子颜色完全相同,则视为同一种手链。

Solution

会发现这道题就是 Problem 23.2.1:对称同构

直接按照上面推出来的公式实现以下即可。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5 + 7, mod = 1e9 + 7;
const double PI = acos(-1.0);int n, m;int qpow(int a, int b)
{int res = 1;while(b) {if(b & 1) res = res * a;a = a * a;b >>= 1;}return res;
}void solve()
{int res = 0;for(int i = 0; i < n; ++ i) {res += qpow(m, __gcd(i, n));}if(n & 1) {res += n * qpow(m, (n + 1) / 2);}else {res += n / 2 * (qpow(m, n / 2 + 1) + qpow(m, n / 2));}res = res / n / 2;printf("%lld\n", res);
}signed main()
{while(~scanf("%lld%lld", &m, &n) && n + m) {solve();}return 0;
}

0x24.2 只能使用Burnside引理

Problem 24.2.1 AcWing 3134. 魔法手链

给定 m m m 种不同颜色的魔法珠子,每种颜色的珠子的个数都足够多。

现在要从中挑选 n n n 个珠子,串成一个环形魔法手链。

魔法珠子之间存在 k k k 对排斥关系,互相排斥的两种颜色的珠子不能相邻,否则会发生爆炸。(同一种颜色的珠子之间也可能存在排斥)

请问一共可以制作出多少种不同的手链。

注意,如果两个手链经旋转后能够完全重合在一起,对应位置的珠子颜色完全相同,则视为同一种手链。

答案对 9973 9973 9973 取模。
1 ≤ T ≤ 10 1≤T≤10 1≤T≤10
1 ≤ n ≤ 1 0 9 1≤n≤10^9 1≤n≤109
gcd ⁡ ( n , 9973 ) = 1 \gcd(n,9973)=1 gcd(n,9973)=1
1 ≤ m ≤ 10 1≤m≤10 1≤m≤10
0 ≤ k ≤ m ( m + 1 ) 2 0≤k≤\frac{m(m+1)}{2} 0≤k≤2m(m+1)​
1 ≤ a , b ≤ m 1≤a,b≤m 1≤a,b≤m

Solution

这里因为多了很多互斥关系,也就是不同的循环之间有一定有了很多限制,所以不能使用 Polya 定理,只能使用 Burnside引理 。

本题比上一题简化了,只有循环这一种置换。我们可以发现 n n n 很大,需要模 9973 9973 9973 ,并且保证 gcd ⁡ ( n , 9973 ) = 1 \gcd(n,9973)=1 gcd(n,9973)=1 也就意味着我们最后除以 n n n 的时候可以直接使用乘法逆元。

我们设旋转的距离为 k = 0 , 1 , 2 , ⋯ n − 1 k=0,1,2,\cdots n-1 k=0,1,2,⋯n−1。

由于需要使用 Burnside引理,所以我们需要求一下不动点的数量。

设一个点初始位置为 x x x ,那么每转一次就会转到 x + k x+k x+k 的位置

如图 24.2.1 所示

图 24.2.1

那么转多少会重复呢(回到起点,出现 循环

回到起点不一定只赚一圈,可能需要转很多圈,由于点数是有限的,所以我们这样每次走 k k k 步是一定会重复的。

这里很明显可以得到一个同余方程:

x + k t ≡ x ( m o d n ) x+kt\equiv x(\mod n) x+kt≡x(modn)

k t ≡ 0 ( m o d n ) kt\equiv 0(\mod n) kt≡0(modn)

k t = n r + c kt=nr+c kt=nr+c
t = n d t=\cfrac{n}{d} t=dn​

其中 d = gcd ⁡ ( n , k ) d =\gcd(n,k) d=gcd(n,k)

这也就意味着我们走 n d \cfrac{n}{d} dn​ 步就会出现 循环

即:每一个循环一共有 n d \cfrac{n}{d} dn​ 个点。

即:每个循环均使用了 n d \cfrac{n}{d} dn​ 个点,而我们一共有 n n n 个点,

所以一共会有 n n d = d \cfrac{n}{\frac{n}{d}}=d dn​n​=d 个循环。

即我们仅有旋转这一种置换操作,会得到 d = gcd ⁡ ( n , k ) d=\gcd(n,k) d=gcd(n,k) 个循环。

我们发现 每个循环均有 n d \cfrac{n}{d} dn​ 个点,我们可以先分析一个循环,其余的循环与该循环性质相同,分析一个循环即可得到所有的循环的答案。

我们发现了这一个循环的 n d \cfrac{n}{d} dn​ 个点的一个性质:我们按照原本的点的编号的顺序看,任意两个相邻的点之间的距离均为 d d d 。


证明: d = gcd ⁡ ( n , k ) d=\gcd(n,k) d=gcd(n,k)

设 k ′ = k d k'=\cfrac{k}{d} k′=dk​, n ′ = n d n'=\cfrac{n}{d} n′=dn​。

由于我们每次走都是跳 k k k 步,然后如果跳过了一圈长度为 n n n 以后,就 % n \% n %n。因为 k k k 和 n n n 是 d d d 的倍数,所以我们从起点 x x x 出发,每次走到的点到起点的距离都必然是 d d d 的倍数。然后因为我们一共走了 n d \cfrac{n}{d} dn​ 步,而每一步又都是 d d d 的倍数,也就是说我们每次走的就是距离可以写成表格,并且我们将 0 , d , 2 d ⋯ 0,d,2d\cdots 0,d,2d⋯ 做一个映射:

距离   0  d  2d  3d  ...  (n / d - 1) * d = n - 1
步数   0  1  2   3   ...           n / d
映射   0  1  2   3   ...           n / d

也就意味着我们每一步走的距离均为 d d d 。

综上所诉,该性质得证 □


这个性质也就意味着对于每一个循环(我们当前分析的就是一个循环),我们只需要考虑 d d d 的倍数的这 n d \cfrac{n}{d} dn​ 个点即可。

所以我们仅考虑这些点的映射( 0 , 1 , 2 , 3 , ⋯ 0,1,2,3,\cdots 0,1,2,3,⋯),就会得到一个长度为 n ′ = n d n'=\cfrac{n}{d} n′=dn​ 的一个小环(共有 n ′ = n d n'=\cfrac{n}{d} n′=dn​ 个点),并且每次跳的距离是 k ′ k' k′,其中 k ′ = k d k'=\cfrac{k}{d} k′=dk​,即 k ′ k' k′ 与 n n n 互质。也就可以证明这样跳,一定能遍历到这个小环的所有的点。

小环如图 24.2.2 所示

图 24.2.2

因为可以遍历这个小环的所有的点,可以得到:

k ′ × 0 , k ′ × 1 , k ′ × 2 , ⋯ , k ′ × ( n − 1 ) k'\times 0,k'\times 1,k'\times 2,\cdots,k'\times (n-1) k′×0,k′×1,k′×2,⋯,k′×(n−1) 构成了一个 0 0 0 ~ n n n 的一个简化剩余系。( 即该 k ′ k' k′ 的序列在 m o d n \mod n modn 意义下还是 0 0 0 ~ n − 1 n-1 n−1)


证明:

我们使用反证法。

假设 k ′ × 0 , k ′ × 1 , k ′ × 2 , ⋯ , k ′ × ( n − 1 ) k'\times 0,k'\times 1,k'\times 2,\cdots,k'\times (n-1) k′×0,k′×1,k′×2,⋯,k′×(n−1) 不是 0 0 0 ~ n n n 简化剩余系,即序列中存在两个下标, i ≠ j i≠j i​=j 且 k ′ i = k ′ j k'i=k'j k′i=k′j

k ′ i = k ′ j k'i=k'j k′i=k′j

实际上就是:

k ′ ( i − j ) ≡ 0 ( m o d n ) k'(i-j)\equiv0(\mod n) k′(i−j)≡0(modn)

因为 k ′ k' k′ 与 n n n 互质,所以可以吧 k ′ k' k′ 去掉

即: i ≡ j ( m o d n ) i\equiv j(\mod n) i≡j(modn)

而 0 ≤ i , j < n 0\le i,j< n 0≤i,j<n。

若 i ≡ j ( m o d n ) i\equiv j(\mod n) i≡j(modn),则定有 i = j i=j i=j,与前提不符,产生矛盾。

故对于所有的 k ′ i k'i k′i, k ′ j k'j k′j , 0 ≤ i , j < n 0\le i,j <n 0≤i,j<n,任意两个数均不相同,故在 % n \%n %n 的意义下一定能遍历完 0 0 0 ~ n − 1 n-1 n−1 里的每一个数,故一定是 0 0 0 ~ n − 1 n-1 n−1 的一个简化剩余系。

综上所诉,该性质得证 □


由于我们刚刚得到的这一个循环的 n d \cfrac{n}{d} dn​ 个点的一个性质:我们按照原本的点的编号的顺序看,任意两个相邻的点之间的距离均为 d d d 。

以及另一个性质 k ′ × 0 , k ′ × 1 , k ′ × 2 , ⋯ , k ′ × ( n − 1 ) k'\times 0,k'\times 1,k'\times 2,\cdots,k'\times (n-1) k′×0,k′×1,k′×2,⋯,k′×(n−1) 构成了一个 0 0 0 ~ n n n 的一个简化剩余系,也就意味着在 % n \%n %n 的意义下一定能遍历完 0 0 0 ~ n − 1 n-1 n−1 里的每一个数

而我们仅考虑这些点的映射( 0 , 1 , 2 , 3 , ⋯ 0,1,2,3,\cdots 0,1,2,3,⋯),就会得到一个长度为 n ′ = n d n'=\cfrac{n}{d} n′=dn​ 的一个小环(共有 n ′ = n d n'=\cfrac{n}{d} n′=dn​ 个点),并且每次跳的距离是 k ′ k' k′。我们再回代,即乘上一个 d d d 以后,就意味着可以遍历所有与 x x x 的距离为 d d d 的倍数的点。

而最开始我们由得到了仅考虑旋转这一种置换,我们一共会有 d d d 个循环,每次循环的步数(走的距离)均为 d d d ,也就是每个循环的起点,为 x , x + d , x + 2 d , ⋯ x,x+d,x+2d,\cdots x,x+d,x+2d,⋯。

也就意味着第一个循环的区间为 [ x , x + d − 1 ] [x,x+d-1] [x,x+d−1],第二个循环的区间为 [ x + d , x + 2 d − 1 ] [x+d,x+2d-1] [x+d,x+2d−1],以此类推。我们之前说过,由于仅是旋转操作,得到的 d d d 个循环的解法一摸一样,每一个循环的不动点的个数均相同,即为每一个循环内部的点的颜色按照顺序相同。

例如:第一个循环的颜色为 1 2 3 4 5 ,则第二个循环的颜色同样为 1 2 3 4 5 ,以此类推。

具体图形如图 24.2.3 所示:

图 24.2.3

因为每一个循环区间内部点的颜色都是相同的,也就意味着每个区间的最后一个点和下一个区间的第一个点相邻,而下一个区间的第一个点和这个区间的第一个点的颜色是相同的,所以我们就可以看作每个区间的最后一个点和该区间的第一个点是相邻的,也就意味着每个长度为 d d d 的小区间又可以看作是一个循环,也就可以画成一个更小的圈。

也就意味着我们只需要讨论一下这个长度为 d d d 的圈有多少个染色方案就行啦!

这个染色方案的数量就是这个置换的这个循环的不动点的数量。(因为这个圈固定以后,这一个段就固定了,那么这一小段的这个区间固定了以后,因为整个环分为 d d d 段,也就是 d d d 个循环,那么整个环也就固定了)

也就是说我们只需要求一下长度为 d d d 的,满足要求的这个环的染色方案即可。

那么怎么求解这个方案数呢?我们仅需枚举一下这个环的起点

图24.24

我们分情况讨论一下,我们枚举一下 d d d这个点是那种颜色,因为一共有 m m m 种颜色,所以我们 1 1 1 ~ m m m 枚举一遍。

我们求一下 d d d 染乘 1 1 1 的所有方案, d d d 染 2 2 2 的所有方案, ⋯ \cdots ⋯ 到 d d d 染 m m m 的所有方案。

若 d d d 染的颜色为 i i i ,我们可以使用 DP 来求解这个答案。

f [ i ] [ j ] f[i][j] f[i][j] 表示的是染完了前 i i i 个珠子的颜色,并且最后一个珠子的颜色为 j j j 的所有方案的数量。

例如我们将 d d d 染为 i i i,即 f[0][i] = 1,其余均为 0 0 0:f[0][1] = f[0][2] = ...f[0][m] = 0;。( d d d 就是 1 1 1 前面的这个珠子,编号为 0 0 0)

暴力转移即可:

f[i][j] += vis[k][j] ? f[i - 1][k] : 0;

其中 vis[k][j] 表示 k k k 和 j j j 是否互斥(由题目输入),如果不互斥的话说明 k k k 和 j j j 可以相邻。

最后的答案:分类讨论:

若 d d d 染色为 1 1 1 ,答案为 f[d][1]。其余同理。

但是由于本题的 n ≤ 1 0 9 n\le 10^9 n≤109 ,暴力转移无法通过,所以我们可以使用矩阵乘法来优化。

设 F [ i ] = f [ i ] [ 1... m ] F[i]=f[i][1...m] F[i]=f[i][1...m]

则 F [ i ] = F [ i − 1 ] ∗ M F[i] = F[i - 1] * M F[i]=F[i−1]∗M

其中转移矩阵 M 就代表 若 k k k 和 j j j 可以相邻,互不排斥,就为 1 1 1 ,否则就为 0 0 0 。(该矩阵的转移方程实际上展开以后就是上面的DP转移方程)

则答案 F [ d ] = F [ 0 ] ∗ M d F[d]=F[0]*M^d F[d]=F[0]∗Md,我们可以来使用快速幂优化。

总时间复杂度为 O ( M 3 l o g n ) O(M^3logn) O(M3logn)

最后一个问题,因为 n n n 很大,所以我们枚举 k k k 的时候不可能直接枚举。

我们发现 k k k 的唯一作用就是得到 d = gcd ⁡ ( n , k ) d=\gcd(n,k) d=gcd(n,k),而我们非常容易就可以发现很多 g c d ( n , k ) gcd(n,k) gcd(n,k) 是相同的,因此我们就可以将 k k k 按照所有的最大公约数分类,也就是直接枚举 gcd ⁡ ( n , k ) \gcd(n,k) gcd(n,k) 即可,也即是说我们只需要枚举 n n n 的约数即可,那么就意味着最多只会有 φ ( n ≤ 1 0 9 ) ≤ 1600 \varphi(n\le10^9)\le 1600 φ(n≤109)≤1600 种。

则对于所有的 d = gcd ⁡ ( n , k ) d=\gcd(n,k) d=gcd(n,k) 都可以直接使用快速幂来求解。分类之后我们肯定要算一下每一个 d d d 都包含了多少个 k k k,换句话说就是一共有多少个 k k k 满足 gcd ⁡ ( n , k ) = d \gcd(n,k)=d gcd(n,k)=d 呢?

我们发现这就是一个 非常经典的欧拉函数问题。

gcd ⁡ ( n , k ) = d \gcd(n,k)=d gcd(n,k)=d

即: gcd ⁡ ( n d , k d ) = 1 \gcd(\frac{n}{d},\frac{k}{d})=1 gcd(dn​,dk​)=1 的个数,也就是在 0 0 0 ~ n d \cfrac{n}{d} dn​ 种互质的个数,也就是 φ ( n d ) \varphi(\cfrac{n}{d}) φ(dn​)。直接暴力求,复杂度 O ( φ ( n d ) O(\sqrt{\varphi(\cfrac{n}{d}}) O(φ(dn​ ​)。

这里的答案(所有不动点的和)就是 a n s = ∑ d = 0 n F [ 0 ] ∗ M d ∗ φ ( n d ) ans=\sum_{d=0}^{n}F[0]*M^d*\varphi(\cfrac{n}{d}) ans=d=0∑n​F[0]∗Md∗φ(dn​)

最后的答案就是所有不动点的平均值即不动点个数和除以所有置换的个数。

因为我们这里的置换是旋转,一共有 n n n 个点,所以一共有 n n n 种置换

即最后的答案为: a n s n \cfrac{ans}{n} nans​,也就是乘上 n n n 模 9973 9973 9973 的逆元 a n s × i n v ( n ) ans\times inv(n) ans×inv(n)

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 11, P = 9973;int m;
struct Matrix
{int a[N][N];Matrix(){memset(a, 0, sizeof a);}
};Matrix operator* (Matrix a, Matrix b)
{Matrix c;for (int i = 1; i <= m; i ++ )for (int j = 1; j <= m; j ++ )for (int k = 1; k <= m; k ++ )c.a[i][j] = (c.a[i][j] + a.a[i][k] * b.a[k][j]) % P;return c;
}int qmi(Matrix a, int b)
{Matrix res;for (int i = 1; i <= m; i ++ ) res.a[i][i] = 1;while (b){if (b & 1) res = res * a;a = a * a;b >>= 1;}int sum = 0;for (int i = 1; i <= m; i ++ ) sum += res.a[i][i];return sum % P;
}int phi(int n)
{int res = n;for (int i = 2; i * i <= n; i ++ )if (n % i == 0){res = res / i * (i - 1);while (n % i == 0) n /= i;}if (n > 1) res = res / n * (n - 1);return res % P;
}int inv(int n)
{n %= P;for (int i = 1; i < P; i ++ )if (i * n % P == 1)return i;return -1;
}int main()
{int T;cin >> T;while (T -- ){int n, k;cin >> n >> m >> k;Matrix tr;for (int i = 1; i <= m; i ++ )for (int j = 1; j <= m; j ++ )tr.a[i][j] = 1;while (k -- ){int x, y;cin >> x >> y;tr.a[x][y] = tr.a[y][x] = 0;}int res = 0;for (int i = 1; i * i <= n; i ++ )if (n % i == 0){res = (res + qmi(tr, i) * phi(n / i)) % P;if (i != n / i)res = (res + qmi(tr, n / i) * phi(i)) % P;}cout << res * inv(n) % P << endl;}return 0;
}

讲完啦!光着一道题就是四五千字的题解,快写死我了,你看懂了嘛?(●ˇ∀ˇ●)

看不懂没关系,点个赞就懂了 = ̄ω ̄=

0x30 竞赛例题选讲

待更…

  • UVA10294 Arif in Dhaka (First Love Part 2)

  • P4128 [SHOI2006]有色图

  • P4727 [HNOI2009]图的同构记数

待更…


参考资料:

  • 群论习题集
  • 群论
  • 漫谈OI中的群论入门
  • Burnside引理与Polya定理
  • 置换群学习笔记
  • 解题报告 (五) Burnside引理和Polya定理
  • 【组合数学】通俗解释 Burnside引理和Polya定理
  • Burnside引理与Polya定理
  • 群论 学习笔记
  • http://www.doc88.com/p-118697800993.html

聪明的你,一定学会 (废) 了吧 (●ˇ∀ˇ●)

《小学生都能看懂的群论从入门到升天教程》 《群论全家桶》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. Cell颠覆性发现:中脑神经元的新作用
  2. 这是人家大一新生开发的工具!网友:我好菜
  3. 网络登录_发布猫系统登录免费网络推广-绥芬河推广资讯
  4. yum 多线程插件,apt多线程插件
  5. linux 安装源码网卡包,【linux命令】Linux通过yum 或者源码编译安装vnstat查看网卡流量...
  6. php _get返回,php如何无刷新获取get返回值
  7. 善用assert函数
  8. cesium 原生抛物线
  9. 利用keras训练自己的图片数据集
  10. C#保存图片到数据库,读取图片显示
  11. c语言计算10亿位圆周率,C语言:圆周率的计算
  12. JS字符串转换为JSON的四种方法
  13. VLAN 划分——基于交换机端口划分VLAN
  14. IDEA开发工具删除代码注释
  15. Hyperledger Explorer部署
  16. 链塔智库|区块链产业要闻及动态周报(2020年10月第2周)
  17. ionic的生命周期
  18. 听说你想薅东航的羊毛?
  19. Xiaojie雷达之路---雷达原理(二刷)相位法测角
  20. 1682亿!!阿里工程师如何喝着茶创造双11奇迹?

热门文章

  1. 翻译GDC演讲《精心制作一个微小的开放世界:‘A Short Hike‘ 事后分析》(1):立项,画风
  2. LWN:以QEMU为例解析软件复杂度!
  3. 山顶之光摩天轮制作教程
  4. What!吴恩达要参加美国大选?带你一起用人脸识别技术看看真的是吴恩达吗?
  5. c语言小游戏猜数字学习完函数后的小练习。
  6. K. MUV LUV UNLIMITED(树上博弈)
  7. QQ分享无法回调的问题
  8. 下载.m3u8,.ts格式的视频文件
  9. 人工智能也能玩音乐游戏,自动学习编曲变身劲舞大师
  10. oracle执行文件,Oracle执行外部文件: