长文警告。
本文对于 Polya 定理中使用到的绝大部分引理都进行了伪证 较为成分的证明。
在阅读这篇文章的时候,您可以选择性的跳过您所知道的知识,下面将从 “群” 这一个充满魔法的东西开始谈起。
定义集合 G 和作用与集合 G 的二元运算 ×
若其满足以下 4 个性质,则称其为一个群(Group),记为 ( G,× ):
1. 封闭性 (Closure)
若存在 a 和 b 满足 a∈G,b∈G ,则有 a×b∈G
2. 结合律 (Associativity)
对于任意 a,b,c 有 (a×b)×c=a×(b×c)
3. 单位元 (Identity)
存在 e∈G,满足对于任意 a∈G 有: a×e=e×a=a
这样的 e 被称为单位元。容易证明单位元唯一(你假设有多个可以马上推出矛盾)
e.g: 实数的乘法运算就是一个群,模意义下的乘法运算(不包括0)同样是一个群。这些例子中的单位元均为 1
4. 逆元 (Inverse)
对于任意 a∈G 存在 a′∈G 满足 a×a′=a′×a=e
值得注意的是这个 a′ 是唯一的。读者可以尝试自行证明。
性质的实际应用:
1−question: 为什么不能使用传统的树状数组实现区间最值查询。
1−answer: 树状数组在于运算上存在一个差分的过程,换而言之需要"逆元"的存在,然而最值函数与数集S不构成群。(好像在扯淡)
如果 H 为 G 的一个子集,且有 ( H,× ) 构成一个群,那么称 (H,×) 为 (G,×) 的一个子群。简记为 H≤G。
如果 G 是一个群,H 为其一个子群,且有 g∈G,那么:
gH=g×h,h∈H,称其为 H 在 G 内的关于 g 的左陪集。
Hg=h×g,h∈H,称其为 H 在 G 内的关于 g 的右陪集。
陪集的一些性质:
下面只讨论右陪集:(左陪集同理)
1. ∀g∈G,∣H∣=∣Hg∣
证明:注意到 “群的性质” : 逆元唯一,所以有对于任意的 g×h1 与 g×h2 其必然不同。
2. ∀g∈G,g∈Hg
证明:注意到 H 是一个群,所以 H 必然包括了单位元e,所以 e×g∈Hg⟺g∈Hg
3. Hg=H⟺g∈H
证明显然,由于封闭性可以得到。
4. Ha=Hb⟺a×b−1∈H
证明:
首先你发现陪集像极了运算,所以有:Ha=Hb⟹Ha×b−1=H 由于性质3 得到: a×b−1∈H
由于 a×b−1∈H 所以 Ha=Hb …这个显然,配合性质 3 食用。
5. Ha∩Hb=∅→Ha=Hb
这个性质非常有用,其意味着一个子群 H 的陪集的交集要么是空要么两个相等。
证明:假设 c∈Ha,c∈Hb ,于是有 ∃ h1,h2∈H,h1×a=c,h2×b=c 所以我们得到:ab−1=h2h1−1∈H 由于 性质4 得到 Ha=Hb。
6. H 的全体右陪集的并为 G
证明:因为 H 存在单位元,g 取遍 G 中每一个元素。
若 H≤G,则 G/H 代表 G 中所有的 H 的左陪集即{gH,g∈G}
若 H≤G,则 [G:H] 表示 G 中 H 的不同的陪集的数量。
对于有限群 G 与有限群 H ,若 H 为 G 的子群,那么有:
∣H∣整除∣G∣
即 H 的阶整除 G 的阶。
更具体点:
∣H∣×[G:H]=∣G∣
证明:
由于陪集的性质1,5,6,所有本质不同的陪集互不相交且大小均为 ∣H∣ 且并的大小为∣G∣,可以得到不同的陪集数量乘以陪集大小(∣H∣)为 G 。你会发现有了陪集的性质之后这些都特别自然了。
备注:一个充满魔法的科技。
双行表示法,大概就是用两个括号括起来,然后令 “元素/置换” 表示一个从【上列】 到 【下列】 的置换。
比如:
σ=(1225344351)
其表示的置换为将排列 1 2 3 4 5 变为 2 5 4 3 1 的一个置换,可以理解为用原本第二个元素代替第一个元素,用原本的第 5 个元素代替第 2 个元素…依次类推。
不过我更喜欢强行规定第一列是 (1,2,...n)
然后第二列就是:
σ=(a1,a2...an) 表示一个置换。
每个置换都是一个这样的排列,一个长度为 n 的不同的置换的数量为 n!
可以写为 σ×a 不过更习惯被表示为 σ(a)
其运算规则为:σ(a)=(aσ1,aσ2...aσn)
没错,这是一个运算,通常可以称呼其为置换的「魔法」/「乘法」,如上例可以用文字描述为:σ 和 a「魔法」起来。(这里是我个人认为它非常神奇而称呼其为「魔法」诸位笑笑便好)
更正式的,我们称呼其为置换的「合成」
不妨令集合 N={1,2,3...n} ,令集合 M 为 N 的若干个排列构成的集合,我们令群 G=(M,×),其中 × 这个运算为「魔法」/「合成」,若再此基础上,其满足群的性质。则我们称 G 是一个置换群。
我们现在来验证一个例子,N 的所有可能的排列与运算「魔法」构成的 "二元组?"(这里不太清楚如何称呼) 是一个合法的置换群:
1. 封闭性,显然,注意上面定义的是所有可能的排列。
2. 单位元 :e=(1,2,...n)
容易发现 σ「魔法」e=e「魔法」σ=σ
3. 结合律:容易验证「魔法」满足结合律。
4. 逆元:容易验证「魔法」运算存在逆元。
分为 左群作用 和 右群作用。具体不太记得了…下面描述的是左群作用的定义,下文出于方便,将同一称为「群作用」,并使用此处的定义。
定义:
对于一个集合 M 和群 G 。
若给定了一个二元函数 φ(v,k) 其中 v 为群中的元素,k 为集合元素,且有:
φ(e,k)=k(e 是单位元)
φ(g,φ(s,k))=φ(g×s,k)
则称呼群 G 作用于集合 M。
考虑一个作用在 X 上的群 G 。 X 中的一个元素 x 的「轨道」则是 x 通过 G 中的元素可以转移到的元素的集合。x 的轨道被记为 G(x),方便起见,我们用 g(x) 表示群 G 元素 g 作用于 x 的群作用的返回值,即 g(x)=φ(g,x)。
稳定子被定义为:Gx={g∣g∈G,g(x)=x}
使用语言描述,便是群 G 中满足 g(x)=x 的所有元素 g 所构成的集合。
e.g:
给定一个 2×2 的矩形,每个点可以使用黑白染色,这样得到的所有矩形构成的集合为 M
给定一个群 G ,其成员为 1. 顺时针旋转90°,2. 顺时针旋转180°,3. 顺时针旋转270°,4. 顺时针旋转0°。其运算为模360意义下的加法(大概,想必诸位理解我的意思)
那么对于一个 M 内的一个元素(0表示白,1表示黑)
(1010)
而言,其稳定子 Gx 为 {顺时针旋转0°}
其轨道为:
(1010),(0011),(0101),(1100)
似乎有一个巧合,轨道大小与稳定子的大小乘积为 4 刚好是群 G 的大小!
- 诸位可以去举其他例子来类比,总是可以发现这个规律。
这个东西有一个名字,叫做轨道-稳定子定理:
∣Gx∣×∣G(x)∣=∣G∣
首先可以证明:Gx 是 G 的一个子群。
首先根据群作用的定义,我们得知:e∈Gx
结合律显然满足,我们接下来考虑证明逆元和封闭性。
封闭性:f∈Gx,g∈Gx 则 f(x)=x,g(x)=x 根据群作用的定义,此时有:(f×g)(x)=x,所以 f×g∈Gx
逆元:若 g∈Gx 则 g(x)=x 又因为 (g×g−1)(x)=e(x)=x 所以 g−1(x)=x 所以 g−1∈Gx
所以按照拉格朗日定理有: ∣Gx∣×[G:Gx]=∣G∣
于是只需要证明 [G:Gx]=∣G(x)∣
然后这个东西直观感受挺对的…但是还是丢一个严谨的证明:
我们只需要证明,每一个 g(x) 都能对应 [G:Gx] 中的一个左陪集/右陪集即可。
不妨这样构造一个一一对应的关系:
若 f(x)=g(x) 则可得:f×g−1=x=e(x)∈Gx,由于陪集的性质f×Gx=g×Gx ,这意味着我们证明了相同的 f(x) 都可以对应相同的陪集。
反之亦然 fGx=gGx⟺f(x)=g(x)
于是每一个 g(x) 我们令 gGx 表示它对应的陪集即可,正确性由上述性质保证不会重复,相同的 g(x) 总是对应着相同的陪集。
公式:
定义 G 为一个置换群,定义其作用于 X,如果 x,y∈X 在 G 作用下可以相等即存在 f∈G 使得 f(x)=y 则定义x,y 属于一个等价类,则不同的等价类的数量为:
∣X/G∣=∣G∣1g∈G∑Xg
其中, Xg 为 X 在 g 作用下的不动点的数量。即满足 g(x)=x 这样的 x 的数量。
文字描述:X 在群 G 作用下的等价类总数等于每一个 g 作用于 X 的不动点的算数平均值。
证明:
由于每个元素属于仅属于一个轨道,轨道内部在群 G 作用下互达,(陪集性质) 所以我们可以得到:
∣X/G∣=x∈X∑[G:Gx]1
根据轨道-稳定子定理,得到:
[G:Gx]=∣Gx∣G
∣X/G∣=x∈X∑GGx
∣X/G∣=∣G∣1x∈X∑Gx
后面那一坨,反过来,就是对于每一个群作用 g ,其作用下不动点的数量。
综上,我们得到 Burnside 定理。
首先观察本题与 Burnside 定理的关系。
容易发现,本质不同的 n 个点的环可以看作,在群 G 为{ 旋转0 个,旋转 1 个…旋转n−1个 } 这些置换作用下得到的等价类的数量。
同时我们定义集合 M 为 {1→n} 的所有可能排列表示初始的环。
于是由于 Burnside 定理,得到:
Ans=∣G∣1g∈G∑Mg
我们依次考虑每个置换对于答案的贡献,显然旋转 0 个的不动点的数量为:nn 即所有集合都合法。
对于旋转 k 个而言,我们知道一个元素是不动点等价于其存在一个长度为 a 的循环节满足 a∣k ,又因为对于循环节 a 而言,必然存在 a∣n ,所以我们可以改写判定条件为存在一个长度为 gcd(k,n) 的循环节。
于是对于旋转 k 个而言,每个子串的前 gcd(k,n) 都是任意取的,所以得到其贡献为 ngcd(k,n)
于是答案为:
n1k=1∑nngcd(k,n)
剩下的就是莫比乌斯反演那一套的套路工作了,下面简单推导:
枚举 gcd 变为:
n1d∣n∑nd×k=1∑dn[gcd(k,dn)==1]
后面那个式子是欧拉函数,直接带入即可:
n1d∣n∑ndφ(dn)
然后本题暴力计算欧拉函数是可以通过的,复杂度为O(Tn43)
Code:
#include<bits/stdc++.h>
using namespace std ;
#define rep( i, s, t ) for( register int i = s; i <= t; ++ i )
#define re register
#define int long long
int gi() {
char cc = getchar() ; int cn = 0, flus = 1 ;
while( cc < '0' || cc > '9' ) { if( cc == '-' ) flus = - flus ; cc = getchar() ; }
while( cc >= '0' && cc <= '9' ) cn = cn * 10 + cc - '0', cc = getchar() ;
return cn * flus ;
}
const int P = 1e9 + 7 ;
int T, n ;
int fpow( int x, int k ) {
int ans = 1, base = x ;
while( k ) {
if( k & 1 ) ans = 1ll * ans * base % P ;
base = base * base % P, k >>= 1 ;
} return ans ;
}
int phi( int x ) {
int ans = x ;
for( re int i = 2; i <= sqrt(x); ++ i ) {
if( x % i ) continue ;
ans = ans - ans / i ;
while( x % i == 0 ) x /= i ;
}
if( x != 1 ) ans = ans - ans / x ;
return ans ;
}
void inc( int &x, int y ) {
( ( x += y ) >= P ) && ( x -= P ) ;
}
signed main()
{
int T = gi() ;
while( T-- ) {
int n = gi(), cnt = sqrt(n), Ans = 0 ;
for( re int i = 1; i <= cnt; ++ i ) {
if( n % i ) continue ;
int p1 = phi(i), f1 = fpow( n, n / i ) ;
f1 = f1 * p1 % P, inc( Ans, f1 ) ;
if( i * i != n ) {
int p2 = phi( n / i ), f2 = fpow( n, i ) ;
f2 = f2 * p2 % P, inc( Ans, f2 ) ;
}
}
cout << Ans * fpow( n, P - 2 ) % P << endl ;
}
return 0 ;
}
这样,这道题做完了,但是这篇文章还没完,接下来要介绍 Poˊlya 定理。(其实也差不多)
考虑如何快速的使用 Burnside 定理进行计算。
我们可以注意到在一般的染色问题/类似的问题求本质不同的 xxx 的问题当中(即 Burnside 派上用场的时候)我们一般都是要求不动点的数量。
对于一个置换 (a1,a2...an) 按照前文,我们规定上列为 (1,2...n) 则其描述的是第一个位置变成 a1…诸如此类的轮换。
在使用 Burnside 解决染色问题的时候,我们需要求的是不动点的数量,而对于上述的置换,假设我们令每个 i 向 ai 连一条边容易发现会得到若干个环,仔细思考,每个环的颜色应当相同。
我们定义这个环的数量为 c(g) 即置换 g 的轮换(环)数。
那么我们现在可以改写 Burnside 定理为:
∣G∣1g∈G∑mc(g)
m 表示可用的颜色数。
这就是 Poˊlya 定理辣!
- 如果你认真的读完了前文的内容,那么这一步应该是相当显然的(
完结撒花!
https://www.cnblogs.com/cyx0406/p/burnside_and_polya.html
https://www.cnblogs.com/yyf0309/p/Burnside.html
https://en.wikipedia.org/wiki/Burnside's_lemma
https://en.wikipedia.org/wiki/Group_action
https://en.wikipedia.org/wiki/Coset
https://en.wikipedia.org/wiki/Lagrange's_theorem_(group_theory)
感谢 tiger 对于本文的改正意见以及指导。