Pólya 定理学习笔记

· · 题解

Pólya 定理在计数方面可以统计「本质不同」的方案个数。

下面从群论的基础开始讲起。

感谢 @Soulist

定义一个集合与作用在其上的二元运算 (G,\times),若其具有:

  1. 封闭性:对于 a,b\in Ga\times b\in G
  2. 结合律:对于 a,b,c\in G(a\times b)\times c = a\times(b\times c)
  3. 单位元:记为 e,对于 a\in Ga\times e = e\times a = a
  4. 逆元:对于 a\in G,存在唯一的逆元记为 a^{-1}\in G,使 a\times a^{-1} = a^{-1}\times a = e

下文中「群的运算」都记为通常的乘法标记 \times

一些性质/定义

群的: 群中元素的个数。记作 |T|.

子群

下文中沿用 $T$ 是 $G$ 的子群讨论一些性质/定理。 ### 陪集 对于任意 $g\in G$,记 $gT$ 为 $G$ 的一个左陪集,表示 $\forall h\in T$ 变为 $g\times h$。$Tg$ 称为右陪集,表示 $\forall h$ 变为 $h\times g$。 下文只讨论左陪集。 $G/T$ 表示 $G$ 中所有 $T$ 的左陪集; $[G:T]$ 表示 $G$ 中所有 $T$ 的左陪集数量,即 $\left|G/T\right|$。 有重要的性质:$g\in T$ 与 $gT = T$ 等价。由封闭性易得。 ### 群作用 分为左群作用和右群作用,下面讨论左群。 对于集合 $S$ 的任意元素 $a$,若对于群 $G$ 的元素 $v,u$ 和单位元 $e$ 有映射 $G\times S\to S$ 记作二元运算 $\circ$,使得 $$ e\circ a = a $$ $$ (v\times u)\circ a = v\circ (u\circ a) $$ 则称 $G$ 作用在 $S$ 上。下文沿用 $\circ$ 记号。 一般的理解就是群的作用效果可以以一定方式推广到一个集合上,虽然该集合不一定具备群的性质。 下文中会有例子,如:一个有标号环从某个点开始的标号序列与旋转该环操作构成的群,作用在每个点的颜色构成的序列上。 ### 置换群 **置换**是「映射」的一种,是指非空集到它本身的**双射**。 经常讨论的是集合 $S = \{a_1,a_2,\cdots,a_n\}$ 上的置换群。 对于该集合,最大的置换群是 $n$ **元对称群**,其阶为 $n!$,可理解为全排列。所有 $n$ 元置换群都是它的子群。 一个置换一般写作: $$g = \begin{pmatrix}a_1,a_2,\cdots,a_n\\a_{p1},a_{p2},\cdots,a_{pn}\end{pmatrix}$$ 如默认上一行是 $(a_1,a_2,\cdots,a_n)$,则也许会省略掉。 有定理:一个 $n$ 元置换可以表示为若干循环循环置换的置换的乘积。顺序选取若干元素 $(a_{p1},a_{p2},\cdots,a_{pn})$,它们的循环置换是: $$\begin{pmatrix} a_{p1},a_{p2},\cdots,a_{pn}\\ a_{p2},a_{p3},\cdots,a_{p1} \end{pmatrix}$$ 该定理也比较显然。把每个置换看作一条有向边,$n$ 个点的图中每个点都有一条出边,形成的图由多个环组成。一个置换的**轮换**就是图上环的集合。 ## 拉格朗日定理 若 $T$ 是 $G$ 的子群,则 $$ |T|\times [G:T] = |G| $$ 证明:首先有 $g\in G$,则 $|gT| = |T|$。 比较显然:已知 $T$ 的元素到 $gT$ 的元素有一个映射,则 $|gT|\le |T|$;如果 $|gT| < |T|$,则一定会有 $v,u\in T,v\not=u$,$g\times v = g\times u$,发现 $g$ 是可乘上 $g^{-1}$ 消去的,则不存在这样的 $v,u$。 然后有 $\forall g_1,g_2\in G$,$g_1T\cap g_2T=\varnothing$ 或 $g_1T = g_2T$。 设 $g_1T\cap g_2T$ 中有元素 $v$,则 $g_1^{-1}\times v,g_2^{-1}\times v\in T$,$g_1^{-1}\times v\times(g_2^{-1}\times v)^{-1}=g_1^{-1}\times v\times v^{-1}\times g_2 = g_1^{-1}\times g_2\in T$。 结合陪集性质,$(g_1^{-1}\times g_2)T = T$,两边同时左乘 $g_1$ 变换,得到 $g_1T = g_2T$。 如果不存在 $v$,则无上述过程。 因此可知:$T$ 在 $G$ 中每个本质不同的陪集阶都为 $|T|$,且互不相交。显然这些陪集的并就是 $G$(因为仅单位元 $e$ 左乘所有元素就可以得到 $G$ 的所有元素),所以拉格朗日定理得证。 ## 轨道-稳定子定理 下文中讨论的群 $T$ 作用在集合 $S$ 上,$x\in S$。 记 $T^x$ 为 $T$ 中作用于 $x$ 上使它没有变化的元素集合。该集合称为 $x$ 的**稳定子**。 记 $T(x)$ 为 $T$ 中所有元素作用在 $x$ 上得到的集合。该集合称为 $x$ 的**轨道**。 轨道-稳定子定理指出: $$|T^x|\times |T(x)| = |T|$$ 对任意 $x\in S$ 都成立。 证明:首先证明 $T^x$ 是 $T$ 的子群,然后运用拉格朗日定理。 $T^x$ 的元素显然都属于 $T$,下面指出它具有群的性质。 1. 封闭性:对于 $a,b\in T^x$,$a\circ x = b\circ x = x$,则群作用的性质 $(a\times b)\circ x = x$,得到 $a\times b\in T^x$,得证。 2. 结合律:显然。 3. 单位元:显然 $T$ 的单位元 $e$ 有 $e\circ x = x$,$e\in T^x$。 4. 逆元:由于 $e\in T^x$,对于 $a\in T^x$ 有 $e\circ x = (a^{-1}\times a)\circ x = a^{-1}\circ(a\circ x) = x$,取 $T$ 中的逆元即可。 于是得证。 运用拉格朗日定理 $|T^x|\times[T:T^x] = |T|$,我们只需要证明 $[T:T^x] = |T(x)|$。 即:$x$ 的稳定子群陪集的个数等于其轨道的大小。 尝试建立双射关系。对于 $g\in T$,我们用 $gT^x$ 对应一个稳定子群的陪集。 对于 $f\circ x = g\circ x$,它们是轨道中的相同元素。则同时左乘 $g^{-1}$ 得到 $(g^{-1}\times f)\circ x = e\circ x$,$g^{-1}\times f\in T^x$,$(g^{-1}\times f)T^x = T^x$,$fT^x = gT^x$。 另外对于 $fT^x = gT^x$ 也有 $g^{-1}\times f\in T^x$,$f\circ x = g\circ x$。于是得证。 ## Burnside 引理 定义:若 $x,y\in S$,且存在 $g\in T$ 使 $g\circ x = y$,则同样有 $g^{-1}\circ y = x$,称 $x,y$ 是本质相同的。 有记号:$S/T$ 表示在 $T$ 的作用下本质不同的每种种类元素集合的集合,即按颜色划分为若干块。 上文有记号 $T^x$ 是 $x$ 在 $T$ 作用下的稳定集合,这里类似地引入 $S^g$ 表示 $g$ 作用下 $S$ 中不改变的元素集合。 Burnside 引理指出 $$ |S/T| = \frac 1{|T|}\sum_{g\in T}|S^g| $$ 发现后求和式本质和枚举 $T^x$ 是一样的,~~但是定理就是这样。~~ 则 $$ |S/T| = \frac 1{|T|}\sum_{x\in S}|T^x| $$ 运用轨道-稳定子定理: $$ \begin{aligned} &\quad\frac 1{|T|}\sum_{x\in S}T^x = \sum_{x\in S}\frac{|T^x|}{|T|} = \sum_{x\in S}\frac 1{|T(x)|} \\ &= \sum_{G\in S/T}\sum_{x\in G}\frac 1{|T(x)|} = \sum_{G\in S/T}\sum_{x\in G}\frac 1{|G|} \\ &= \sum_{G\in S/T}1 = |S/T| \end{aligned} $$ 其核心在于每种颜色不相交,以及同种颜色中每个元素的轨道都为该颜色集合。 ## Pólya 定理 Pólya 定理和 Burnside 引理类似。但我们的问题细化一些: 我们给 $S$ 中每一个元素染色,统计 $T$ 作用下本质不同的染色方案数。 已经介绍轮换的概念,记 $c(g)$ 为 $g$ 中的轮换个数,$N$ 为颜色集合。 $$ |S/T| = \frac 1{|T|}\sum_{g\in T}|N|^{c(g)} $$ 对于它,我们只考虑证明 $|N|^{c(g)} = |S^g|$。 发现每个轮换等价于一个连通块($n$ 个点 $n$ 条出边),$S^g$ 中必然是每个轮换染相同的颜色即可,每个轮换自然有 $|N|$ 种方案,也就是 $|N|^{c(g)}$ 了。 --- ## [P4980 【模板】Pólya 定理](https://www.luogu.com.cn/problem/P4980) 比较单纯的问题,循环置换群作用在长度为 $n$,$n$ 种颜色的颜色序列集合上,求本质不同的方案数。 循环置换按长度有 $0\sim n-1$ 有 $n$ 个分别为 $p_0\sim p_{n-1}$。则: $$ |S/T| = \frac 1n\sum_{i=0}^{n-1}n^{c(p_i)} $$ 考虑 $c(p_i)$。 一个轮换经过了若干次全长 $n$,同时又由若干个 $i$ 步长组成,因此一个轮换的长度是 $\operatorname{lcm}(i,n)$。每个元素在且仅在一个轮换中,因此若干个轮换的总长是 $i\times n$。 得到结论:旋转 $i$ 次的轮换有 $\dfrac{i\times n}{\operatorname{lcm}(i,n)} = \gcd(i,n)$ 个。 但是 $\gcd(0,n)$ 不好处理,我们认为旋转 $0$ 次是旋转 $n$ 次,原式为: $$ |S/T| = \frac 1n\sum_{i=1}^nn^{\gcd(n,i)} $$ 求这个式子是容易的,不展开来讲。 $$ \begin{aligned} |S/T| &= \frac 1n\sum_{d|n}n^d\sum_{i=1}^n[\gcd(n,i) = d] \\ &= \frac 1n\sum_{d|n}n^d\sum_{i=1}^{n/d}[\gcd(\frac nd,i)=1] \\ &= \frac 1n\sum_{d|n}n^d\varphi(\frac nd) \end{aligned} $$ 暴力枚举约数,$O(\sqrt n)$ 求 $\varphi$,$O(\log n)$ 求快速幂可以过。 但是显然可以筛素因子做到 $O(Td(n)\log n)\approx O(Tn^{\frac{1.066}{\ln\ln n}}\log n)$,$10^9$ 中大约是 $O(Tn^{\frac 13}\log n)$。 ```cpp #include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <algorithm> const int p = 1000000007; inline int read() { int x = 0, f = 1; char ch = getchar(); while(ch > '9' || ch < '0') { if(ch == '-') f = -1; ch = getchar(); } do x = x * 10 + ch - 48, ch = getchar(); while(ch >= '0' && ch <= '9'); return x * f; } int fastpow(int a,int b) { int res = 1; while(b) { if(b & 1) res = 1ll * res * a % p; a = 1ll * a * a % p; b >>= 1; } return res; } int n; int phi(int n) { int res = n; for(int i = 2;i * i <= n;i++) { if(n % i) continue; res -= res / i; while(!(n % i)) n /= i; } if(n > 1) res -= res / n; return res; } int f(int d) { return 1ll * fastpow(n,d) * phi(n / d) % p; } void Solve() { n = read(); int ans = 0,d; for(d = 1;d * d < n;d++) if(!(n % d)) { ans = (ans + f(d)) % p; ans = (ans + f(n / d)) % p; } if(d * d == n) ans = (ans + f(d)) % p; std::printf("%lld\n",1ll * ans * fastpow(n,p - 2) % p); return; } int main() { int t = read(); while(t--) Solve(); return 0; } ```