计数:Burnside 引理和 Pólya 定理
群
满足以下条件的集合 \(G\) 在集合 \(G\) 的二元运算 \(\cdot\) 称为一个群:
-
封闭性:若 \(a,b\in G\),则存在 \(a\in G\),使得 \(a\cdot b=c\);
-
结合律:对于 \(\forall a,b,c \in G\),都有 \((a\cdot b)\cdot c=a\cdot(b\cdot c)\);
-
存在单位元:\(G\) 中存在一个元素 \(e\),使得对于 \(\forall a\in G\),都有 \(a\cdot e=e\cdot a\);
-
存在逆元:对于 \(\forall a\in G\),都有 \(b\in G\),使得 \(a\cdot b=b\cdot a=e\),记为 \(b=a^{-1}\)。
置换群
钦定 \(n\) 个元素为 \(1,2,\cdots,n\),若以 \(a_1\in[1,n]\) 表示元素 \(1\),以 \(a_2\in[1,n]\) 表示元素 \(2\),……,以 \(a_n\in[1,n]\) 表示元素 \(n\),且 \(a\) 为 \(1\sim n\) 的一个排列,则用
表示一个置换。
置换的运算 \(p_1p_2\) 表示先做 \(p_1\) 的置换,再做 \(p_2\) 的置换,\(1,2,3,\cdots,n\) 的置换集合在该运算下是一个群,故称之为置换群。
循环
我们约定
叫做 \(n\) 阶循环。
例如
Burnside 引理
最恶心重要的部分。
共轭类
我们约定一个置换分解后 \(k\) 阶循环出现的个数为 \(c_k\) 个,记为 \((k)^{c_k}\)。
则一个置换群 \(S_n\) 中的置换可按分解成的格式 \((1)^{c_1}(2)^{c_2}\cdots(n)^{c_n}\) 的不同分类,其中若 \(c_i=0\),可省略 \((i)^{c_i}\) 不写。
在 \(S_n\) 中具有相同格式的置换全体,叫做与该格式相应的共轭类。
\(k\) 不动置换类
设 \(G\) 是 \(1,2,3,\cdots,n\) 的置换群(也可以设为 \(S_n\) 的一个子群),若 \(k\in[1,n]\cap\mathbb Z\),则称 \(G\) 中使 \(k\) 不变的置换全体记为 \(Z_k\) 为 \(G\) 中使 \(k\) 保持不动的置换类,简称 \(k\) 不动置换类。
例如 \(G=\{e,(2\ 3),(1\ 2)(3\ 4),(1\ 2\ 3),(2\ 3\ 4)\}\) 中使 \(1\) 不动的置换类 \(Z_1=\{e,(2,3),(2,3,4)\}\),其中 \(e\) 是单位元,\((2\ 3)\) 为 \((1)(2\ 3)(4)\) 的缩写,下同。
等价类
P1. 对于给定的关于 \(1,2,3,\cdots,n\) 的置换群 \(G\),若存在置换 \(p\in G\) 使 \(k\) 变为 \(l\),则存在 \(p_2=p_1^{-1} \in G\) 使 \(l\) 变为 \(k\)。\(e\) 使 \(k\) 变为 \(k\)。
P2. 若存在 \(p_1\in G\) 使 \(k\) 变为 \(l\),又存在 \(p_2\) 使 \(l\) 变为 \(m\),则存在置换 \(p_3\in p_1p_2\in G\) 使 \(k\) 变为 \(m\),即对于
有
由 P1 和 P2 可知, \(k\) 在 \(G\) 作用下的“轨迹”形成一个封闭的类,故 \(\{1,2,3,\cdots,n\}\) 中的数 \(k\),若存在置换 \(p_1\) 使 \(k\) 变为 \(l\),则称 \(k\) 和 \(l\) 同属一个等价类。于是 \(1,2,3,\cdots,n\) 可按照 \(G\) 的置换分成若干个等价类,其中 \(k\) 所属的等价类记为 \(E_k\)。
重要定理
定理 1
对于 \(\forall k \in [1,n]\cap\mathbb Z\) 都有 \(|E_k|\ |Z_k|=|G|\)。
*证明
钦定 \(|E_k|=l\),不失一般性,设 \(E_k=\{a_1(=k),a_2,\cdots,a_l\}\),\(a_1,a_2,\cdots,a_l\) 是 \(l\) 个不超过 \(n\) 的各不相同的正整数,由等价类的定义可知存在 \(p_i\in G\) 使得
其中 \(i\in[1,l]\cap\mathbb Z\)。
\(P=\{p_1,p_2,\cdots,p_l\}\) 是属于 \(G\) 的置换集合但不是一个群。\(G_j=Z_kp_i\),其中 \(j\in[1,l]\cap\mathbb Z\)。
由于
故
同样地,\(j\in[1,l]\cap\mathbb Z\)。
\(G_j=Z_kp_j\) 的元素属于 \(G\),而且当 \(i\ne j\) 时,\(G_i\cap G_j=\emptyset\)。
故
其中 \(A \sqcup B\) 表示不交并,即不相交集合 \(A\) 和 \(B\) 的并集。
另一方面,对于 \(\forall p\in G\) 都有
依据 \(E_k\),存在 \(p_j\in G\),使得 \(k\stackrel{p_j}{\longrightarrow}a_j\),所以有
即
依据 \(Z_k\),有 \(pp_j^{-1}\in Z_k\),即 \(p\in Z_kp_j\),从而推出 \(p\in G_j\)。
由于 \(p\) 是 \(G\) 的任意元素,故
则
故
证毕。
Burnside 引理
设 \(G\) 是 \(N={1,2,3,\cdots,n}\) 上的置换群,\(G\) 在 \(N\) 上可引出不同的等价类,其不同的等价类的个数为
或者写成
*证明
不妨作下表,表中的
故第 \(i\) 行求和等于 \(c_1(a_i)\),第 \(j\) 列求和等于 \(|Z_k|\)。
| \(\begin{array}{cc} & & j\\ & s_{ij}\\ a_i &\end{array}\) | \(\begin{array}{cc}1&2&3&\cdots&n\end{array}\) | \(c_1(a_i)\) |
|---|---|---|
| \(\begin{array}{cc}a_1\\a_2\\a_3\\\vdots\end{array}\\a_g\) | \(\begin{array}{cc}s_{11}&s_{12}&s_{13}&\cdots&s_{1n}\\s_{21}&s_{22}&s_{23}&\cdots&s_{2n}\\s_{31}&s_{32}&s_{33}&\cdots&s_{3n}\\ & &\vdots\\s_{g1}&s_{g2}&s_{g3}&\cdots&s_{g_n}\end{array}\) | \(\begin{array}{cc}c_1(a_1)\\c_1(a_2)\\c_1(a_3)\\\vdots\\c_1(a_g)\end{array}\) |
| \(\lvert Z'_j \rvert\) | \(\begin{array}{cc}\lvert Z'_1 \rvert&\lvert Z'_2 \rvert&\lvert Z'_3 \rvert&\cdots&\lvert Z'_n \rvert\end{array}\) | \(\sum\limits_{i=1}^gc_1(a_i)=\sum\limits_{j=1}^n\lvert Z'_j \rvert\) |
我是绝对不会告诉你我一早上只画了这一张表的。
若 \(N=\{1,2,\cdots,n\}\) 分解为 \(l\) 个等价类:
当 \(j\) 和 \(k\) 同属一个等价类时,有 \(|Z_j|=|Z_k|\),故
由于 \(|E_i|\ |Z_i|=|G|\)(\(i\in [1,l]\cap \mathbb Z\)),则有
Pólya 定理
设 \(\bar G\) 是 \(n\) 个对象的一个置换群,用 \(m\) 种颜色对 \(n\) 个对象染色,则不同的染色方案数为
其中 \(\bar G={\bar a_1,\bar a_2,\bar a_3,\cdots,\bar a_g}\),\(c(\bar a_k)\) 为置换 \(a_k\) 的循环节数。
*证明
钦定 \(n\) 个对象用 \(m\) 种颜色进行涂色所得的方案集合为 \(S\),显然有 \(|S|=m^n\)。
\(\bar G\) 的每一个元素 \(\bar a_{j}\) 对应于 \(n\) 个对象的一个排列,也对应了 \(S\) 中的 \(m^n\) 个涂色方案的一个排列,记作 \(a_j\)。
这样,\(n\) 个对象上的群 \(\bar G\),对应于作用在 \(S\) 上的群 \(\bar G\),故
且有 \(c_1(a_j)\)=\(m^{c(\bar a_j)}\),与前面的证法类似,可得 \(S\) 按 \(G\) 分成不同等价类的个数为
证毕。
*母函数形式的 Pólya 定理
众所周知 Pólya 定理不仅仅能够用来计数。
我们考虑将 Pólya 定理推广到母函数(生成函数)形式,以便对状态进行列举。
设有对象集合 \((a_1,a_2,a_3,a_4)\),用 \((c_1,c_2,c_3)\) \(3\) 种颜色来涂染,每个对象着一色,例如 \(a_1\) 着 \(c_1\) 色,\(a_2\) 着 \(c_3\) 色,\(a_3\) 着 \(c_2\) 色,\(a_4\) 着 \(c_1\) 色,规定对象顺序是 \(a_1a_2a_3a_4\),上述着色方案用 \(c_1c_3c_2c_1\) 表示。
如果我们不关心具体的对象涂染了什么颜色,只关心方案用了哪些颜色,我们可以进一步写成 \(c_1^2c_2c_3\)。
例如使用蓝、绿、红、黄这 \(4\) 种颜色涂染 \(3\) 个同样的球,不妨记为 \(b,g,r,y\),所有方案可写为 \((b+g+r+y)^3\),由于 \(3\) 个球无区别,故乘法是可交换的。
展开式中的文字项表示方案,系数为方案的数目。
可把上面这种方法应用于 Pólya 定理。
设对 \(n\) 个对象用 \(m\) 种颜色 \(b_1,b_2,b_3,\cdots,b_n\) 进行着色,对应于置换 \(a_i\) 的 \(k\) 阶\(^\dag\)循环因子,其中 \(k\) 个对象,同一颜色用了 \(k\) 次,故在
中 \(m^{c(a_i)}\) 项用
引进循环指数多项式
\(^\dag\)循环因子:一个置换分解成若干循环后的其中一个循环。
得
其中 \(s_k=\sum\limits_{i=1}^m c_1^k\)(\(k\in [1,n]\cap \mathbb Z\))。
证毕。
典例
UVA10733 The Colored Cubes
题意:求给一个正方体的六个面涂上 \(n\) 种颜色的本质不同方案数。
前置知识:Burnside 引理和 Pólya 定理,可以看一下这篇。
使正方体重合的刚体运动群,有如下几种情况:
- 不动置换,即单位元素 \((1)(2)(3)(4)(5)(6)\),格式为 \((1)^6\);
- 绕过面 \(\alpha_1\) 和 \(\alpha_6\) 中心的 \(AB\) 轴旋转 \(\pm 90\degree\),对应有 \((1)(2\ 3\ 4\ 5)(6)\) 以及 \((1)(5\ 4\ 3\ 2)(6)\),如下图所示:

格式为 \((1)^2(4)^1\),正方体有三个对面,故同类置换有 \(6\) 个;
- 绕上图中 \(AB\) 轴旋转 \(180\degree\) 的置换为 \((1)(2\ 4)(3\ 5)(6)\),格式为 \((1)^2(2)^2\),同类置换有 \(3\) 个;
- 绕下图中 \(CD\) 轴旋转 \(180\degree\) 的置换为 \((1\ 6)(2\ 5)(3\ 4)\),格式为 \((2)^3\),正方体中对角线位置平行的棱有 \(6\) 对,故同类置换有 \(6\) 个;

- 绕下图中 \(EF\) 旋转 \(\pm 120\degree\),对应有 \((3\ 4\ 6)(1\ 5\ 2)\) 以及 \((6\ 4\ 3)(5\ 2\ 1)\),格式为 \((3)^2\),正方体的对角线有 \(4\) 条,故同类置换有 \(8\) 个。

依据 Pólya 定理,
于是不同染色方案数为
P4980 【模板】Pólya 定理
题目链接:洛谷
依据 Pólya 定理,
代入 \(|\bar G|=n\),\(c(\bar a_i)=\gcd(n,i)\) 得
改为枚举 \(\gcd\),令 \(f(i)=m^i\) 得
其中 \(f*g\) 为 \(f\) 和 \(g\) 的 Dirichlet 卷积。
则有
代入 \(m=n\) 得到
枚举 \(d\) 计算贡献即可,时间复杂度 \(O(n^{\frac{3}{4}})\)。
int phi(int n)
{
int ret=1;
for(int i=2;i*i<=n;i++)
if(n%i==0)
{
n/=i;
ret*=(i-1);
while(n%i==0)
{
n/=i;
ret*=i;
}
}
if(n>1)
ret*=(n-1);
return ret;
}
int polya(int m,int n)
{
int ans=0;
for(int i=1;i*i<=n;i++)
if(n%i==0)
{
ans=(ans+phi(i)*quick_pow(m,n/i-1,mod)%mod)%mod;
if(i*i!=n)
ans=(ans+phi(n/i)*quick_pow(m,i-1,mod)%mod)%mod;
}
return ans;
}
图同构计数问题
P4727 [HNOI2009] 图的同构计数
题目链接:洛谷
问题相当于对 \(n\) 个无标志顶点的完全图的 \(\frac{n(n-1)}{2}\) 条边,用 \(2\) 种颜色(分别表示该边存在和不存在)进行着色,求不同方案数的问题。
先 dfs 枚举 \(n\) 的拆分再使用 Burnside 求解即可。
没有分析过程是因为我懒得写了。
void Burnside(int n,int b[])
{
int k=0,prod=1;
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
k+=__gcd(b[i],b[j]);
for(int i=1;i<=n;i++)
{
k+=b[i]>>1;
prod=prod*b[i]%p;
}
for(int i=1,j;i<=n;i=j)
{
for(j=i;j<=n&&b[i]==b[j];j++)
; // consecutive
prod=prod*fac[j-i]%p;
}
ans=(ans+quick_pow(prod,p-2,p)*quick_pow(m,k,p)%p)%p;
}
int b[105];
void dfs(int cur,int l,int rst) // enum b
{
if(rst<=0)
{
Burnside(cur-1,b); // Burnside
return;
}
for(int i=l;i<=rst;i++)
{
b[cur]=i;
dfs(cur+1,i,rst-i);
}
}
另解:使用母函数形式的 Pólya 定理,但是我不太会。
*P4128 [SHOI2006] 有色图
题目链接:洛谷
和上一题差不多,把 \(2\) 换成 \(m\) 即可。
UVA11255 Necklace
依据 Burnside 引理,
显然对于本题我们需要求出 \(c_1(a_i)\)。
我们考虑 \(c_1(a_i)\) 的意义,即在 \(a_i\) 作用下保持不动的元素个数。在本题中即为经过一次置换后前后状态本质相同的状态个数。
我们不采用题目中给定的 \(n\) 的定义,钦定数据组数为 \(t\),令 \(n=a+b+c\)。
不妨先考虑旋转带来的影响。钦定经过某一种旋转置换后 \(d_{(i+k-1)\bmod n+1}\gets d_i\),即将第 \(i\) 颗珍珠旋转到第 \((i+k-1)\bmod n+1\) 的位置。
则该置换由 \(\gcd(n,k)\) 个长度相等的循环构成,即
同时要保证 \(\forall i\in [1,\frac{n}{\gcd(n,k)}]\cap \mathbb Z\),\(j,k\in [1,\gcd(n,k)]\cap \mathbb Z\) 都有 \(d_{i,j}=d_{i,k}\),否则旋转后两个状态本质不同。
不妨令 \(t=\frac{n}{\gcd(n,k)}\),则一定有 \(t\mid a \land t\mid b\land t\mid c\),若不满足该条件,则无法保证每个环内的颜色相同,方案数为 \(0\)。
考虑每种颜色的环有多少个。显然,白色环有 \(r_a=\frac{a}{t}\) 个,灰色环有 \(r_b=\frac{b}{t}\) 个,黑色环有 \(r_c=\frac{c}{t}\) 个。
考虑排列这些环的方案数,有
枚举 \(k\) 将贡献累加即可。
然后考虑翻转带来的影响。注意到 \(n\) 的奇偶性对翻转前后相同状态的数量以及翻转轴的位置有影响,考虑分类讨论。
\(n\) 为奇数时,显然所有翻转轴都是经过一颗珍珠和一段线,如下图所示。

而翻转轴共有 \(n\) 条,每一个置换的格式都为 \((1)^1(2)^{\frac{n-1}{2}}\),对经过的珍珠的颜色进行枚举并将贡献累加得到
\(n\) 为偶数时,有 \(\frac{n}{2}\) 条翻转轴经过两颗珍珠,有 \(\frac{n}{2}\) 条翻转轴经过两段线,同样地,翻转轴有 \(n\) 条,每一个置换的格式都为 \((1)^2(2)^{\frac{n}{2}-1}\),枚举经过的珍珠的颜色,同样将贡献累加得到
将所有贡献相加即为 \(\sum\limits_{i=1}^gc_1(a_i)\),而 \(|G|=2n\),二者相除即为最终答案,注意计算时可能溢出,尽量边乘边除。
void dv(__int128 &x,int &a,int &b)
{
if(a)
while(x%a==0)
{
x/=a--;
if(!a)
break;
}
if(b)
while(x%b==0)
{
x/=b--;
if(!b)
break;
}
}
__int128 f(int a,int b,int c,int x)
{
if(a%x||b%x||c%x||a<0||b<0||c<0)
return 0;
a/=x;
b/=x;
c/=x;
int n=a+b+c;
__int128 ret=1;
for(int i=n;i>a;i--)
{
__int128 tmp=i;
dv(tmp,b,c);
ret*=tmp;
dv(ret,b,c);
}
return ret;
}
n=a+b+c;
for(int i=1;i<=n;i++)
{
sum+=f(a,b,c,n/__gcd(i,n));
ans+=sum/(n<<1);
sum%=(n<<1);
}
if(n&1)
{
sum+=(f(a-1,b,c,2)+f(a,b-1,c,2)+f(a,b,c-1,2))*n;
ans+=sum/(n<<1);
sum%=(n<<1);
}
else
{
sum+=(f(a,b,c,2)+f(a-1,b-1,c,2)+f(a-1,b,c-1,2)+f(a,b-1,c-1,2))*n;
ans+=sum/(n<<1);
sum%=(n<<1);
}
编者按
带有*标记的为可跳过部分。
本文在 CSDN 和洛谷同步更新。后续会不会补充未知。
CSDN 链接:https://blog.csdn.net/yingjingxu/article/details/146433892

浙公网安备 33010602011771号