1 条题解
-
0
自动搬运
来自洛谷,原作者为

Soulist
再见了搬运于
2025-08-24 22:05:52,当前版本为作者最后更新于2020-02-16 14:19:25,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
长文警告。
本文对于 定理中使用到的绝大部分引理都进行了
伪证较为成分的证明。在阅读这篇文章的时候,您可以选择性的跳过您所知道的知识,下面将从 "群" 这一个充满魔法的东西开始谈起。
群
群的定义
定义集合 和作用与集合 的二元运算
若其满足以下 个性质,则称其为一个群,记为 :
封闭性
若存在 和 满足 ,则有
结合律
对于任意 有
单位元
存在 ,满足对于任意 有:
这样的 被称为单位元。容易证明单位元唯一(你假设有多个可以马上推出矛盾)
实数的乘法运算就是一个群,模意义下的乘法运算(不包括)同样是一个群。这些例子中的单位元均为
逆元
对于任意 存在 满足
值得注意的是这个 是唯一的。读者可以尝试自行证明。
性质的实际应用:
为什么不能使用传统的树状数组实现区间最值查询。
树状数组在于运算上存在一个差分的过程,换而言之需要"逆元"的存在,然而最值函数与数集不构成群。
(好像在扯淡)子群:
如果 为 的一个子集,且有 构成一个群,那么称 为 的一个子群。简记为 。
如果 是一个群, 为其一个子群,且有 ,那么:
,称其为 在 内的关于 的左陪集。
,称其为 在 内的关于 的右陪集。
陪集的一些性质:
下面只讨论右陪集:(左陪集同理)
,
证明:注意到 "群的性质" : 逆元唯一,所以有对于任意的 与 其必然不同。
,
证明:注意到 是一个群,所以 必然包括了单位元,所以
证明显然,由于封闭性可以得到。
证明:
首先你发现陪集像极了运算,所以有: 由于性质 得到:
由于 所以 ...这个显然,配合性质 食用。
这个性质非常有用,其意味着一个子群 的陪集的交集要么是空要么两个相等。
证明:假设 ,于是有 , 所以我们得到: 由于 性质 得到 。
的全体右陪集的并为
证明:因为 存在单位元, 取遍 中每一个元素。
较为常见的表述:
若 ,则 代表 中所有的 的左陪集即
若 ,则 表示 中 的不同的陪集的数量。
拉格朗日定理:
对于有限群 与有限群 ,若 为 的子群,那么有:
即 的阶整除 的阶。
更具体点:
证明:
由于陪集的性质,所有本质不同的陪集互不相交且大小均为 且并的大小为,可以得到不同的陪集数量乘以陪集大小为 。你会发现有了陪集的性质之后这些都特别自然了。
置换
备注:一个充满魔法的科技。
一些定义:
双行表示法,大概就是用两个括号括起来,然后令 "元素/置换" 表示一个从【上列】 到 【下列】 的置换。
比如:
$\sigma=\begin{pmatrix}1&2&3&4&5\\2&5&4&3&1\end{pmatrix}$
其表示的置换为将排列 变为 的一个置换,可以理解为用原本第二个元素代替第一个元素,用原本的第 个元素代替第 个元素...依次类推。
不过我更喜欢强行规定第一列是
然后第二列就是:
表示一个置换。
每个置换都是一个这样的排列,一个长度为 的不同的置换的数量为
运算:
可以写为 不过更习惯被表示为
其运算规则为:$\sigma(a)= (a_{\sigma_1},a_{\sigma_2}...a_{\sigma_n})$
没错,这是一个运算,通常可以称呼其为置换的「魔法」/「乘法」,如上例可以用文字描述为: 和 「魔法」起来。(这里是我个人认为它非常神奇而称呼其为「魔法」诸位笑笑便好)
更正式的,我们称呼其为置换的「合成」
置换群:
不妨令集合 ,令集合 为 的若干个排列构成的集合,我们令群 ,其中 这个运算为「魔法」/「合成」,若再此基础上,其满足群的性质。则我们称 是一个置换群。
我们现在来验证一个例子, 的所有可能的排列与运算「魔法」构成的 "二元组?"(这里不太清楚如何称呼) 是一个合法的置换群:
封闭性,显然,注意上面定义的是所有可能的排列。
单位元
容易发现 「魔法」「魔法」
结合律:容易验证「魔法」满足结合律。
逆元:容易验证「魔法」运算存在逆元。
「群作用」
分为 左群作用 和 右群作用。具体不太记得了...下面描述的是左群作用的定义,下文出于方便,将同一称为「群作用」,并使用此处的定义。
定义:
对于一个集合 和群 。
若给定了一个二元函数 其中 为群中的元素, 为集合元素,且有:
则称呼群 作用于集合 。
轨道-稳定子定理:
轨道
考虑一个作用在 上的群 。 中的一个元素 的「轨道」则是 通过 中的元素可以转移到的元素的集合。 的轨道被记为 ,方便起见,我们用 表示群 元素 作用于 的群作用的返回值,即 。
稳定子
稳定子被定义为:
使用语言描述,便是群 中满足 的所有元素 所构成的集合。
给定一个 的矩形,每个点可以使用黑白染色,这样得到的所有矩形构成的集合为
给定一个群 ,其成员为 顺时针旋转°, 顺时针旋转°, 顺时针旋转°, 顺时针旋转°。其运算为模意义下的加法(大概,想必诸位理解我的意思)
那么对于一个 内的一个元素(表示白,表示黑)
而言,其稳定子 为 顺时针旋转°
其轨道为:
$\begin{pmatrix}1&1\\0&0\end{pmatrix},\begin{pmatrix}0&1\\0&1\end{pmatrix},\begin{pmatrix}0&0\\1&1\end{pmatrix},\begin{pmatrix}1&0\\1&0\end{pmatrix}$
似乎有一个巧合,轨道大小与稳定子的大小乘积为 刚好是群 的大小!
- 诸位可以去举其他例子来类比,总是可以发现这个规律。
这个东西有一个名字,叫做轨道-稳定子定理:
轨道-稳定子定理:
首先可以证明: 是 的一个子群。
首先根据群作用的定义,我们得知:
结合律显然满足,我们接下来考虑证明逆元和封闭性。
封闭性: 则 根据群作用的定义,此时有:,所以
逆元:若 则 又因为 所以 所以
所以按照拉格朗日定理有:
于是只需要证明
然后这个东西直观感受挺对的...但是还是丢一个严谨的证明:
我们只需要证明,每一个 都能对应 中的一个左陪集/右陪集即可。
不妨这样构造一个一一对应的关系:
若 则可得:,由于陪集的性质 ,这意味着我们证明了相同的 都可以对应相同的陪集。
反之亦然
于是每一个 我们令 表示它对应的陪集即可,正确性由上述性质保证不会重复,相同的 总是对应着相同的陪集。
Burnside 定理
公式:
定义 为一个置换群,定义其作用于 ,如果 在 作用下可以相等即存在 使得 则定义 属于一个等价类,则不同的等价类的数量为:
其中, 为 在 作用下的不动点的数量。即满足 这样的 的数量。
文字描述: 在群 作用下的等价类总数等于每一个 作用于 的不动点的算数平均值。
证明:
由于每个元素属于仅属于一个轨道,轨道内部在群 作用下互达,(陪集性质) 所以我们可以得到:
根据轨道-稳定子定理,得到:
后面那一坨,反过来,就是对于每一个群作用 ,其作用下不动点的数量。
综上,我们得到 定理。
回到本题,下面的关于本题的做法在一定程度上算对于 定理的推导。
首先观察本题与 定理的关系。
容易发现,本质不同的 个点的环可以看作,在群 为 旋转 个,旋转 个...旋转个 这些置换作用下得到的等价类的数量。
同时我们定义集合 为 的所有可能排列表示初始的环。
于是由于 定理,得到:
我们依次考虑每个置换对于答案的贡献,显然旋转 个的不动点的数量为: 即所有集合都合法。
对于旋转 个而言,我们知道一个元素是不动点等价于其存在一个长度为 的循环节满足 ,又因为对于循环节 而言,必然存在 ,所以我们可以改写判定条件为存在一个长度为 的循环节。
于是对于旋转 个而言,每个子串的前 都是任意取的,所以得到其贡献为
于是答案为:
剩下的就是莫比乌斯反演那一套的套路工作了,下面简单推导:
枚举 变为:
$$\dfrac{1}{n}\sum_{d|n} n^d \times \sum_{k=1}^{\frac{n}{d}} [\gcd(k,\dfrac{n}{d})==1] $$后面那个式子是欧拉函数,直接带入即可:
然后本题暴力计算欧拉函数是可以通过的,复杂度为
#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 ; }这样,这道题做完了,但是这篇文章还没完,接下来要介绍 定理。(其实也差不多)
定理
考虑如何快速的使用 定理进行计算。
我们可以注意到在一般的染色问题/类似的问题求本质不同的xxx的问题当中(即 派上用场的时候)我们一般都是要求不动点的数量。
对于一个置换 按照前文,我们规定上列为 则其描述的是第一个位置变成 ...诸如此类的轮换。
在使用 解决染色问题的时候,我们需要求的是不动点的数量,而对于上述的置换,假设我们令每个 向 连一条边容易发现会得到若干个环,仔细思考,每个环的颜色应当相同。
我们定义这个环的数量为 即置换 的轮换(环)数。
那么我们现在可以改写 定理为:
表示可用的颜色数。
这就是 定理辣!
- 如果你认真的读完了前文的内容,那么这一步应该是相当显然的(
完结撒花!
参考资料:
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 对于本文的改正意见以及指导。
- 1
信息
- ID
- 4109
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者