听大佬们说了这么久Pólya定理,终于有时间把这个定理学习一下了。


置换(permutation)简单来说就是一个(全)排列,比如 \(1,2,3,4\) 的一个置换为 \(3,1,2,4\)。一般地,我们记 \(i\) 到 \(a_i(1<=i<=n)\) 的一个置换为

\[\left (
\begin{matrix}
1 & 2 & \cdots & n \\
a_1 & a_2 & \cdots & a_n
\end{matrix}
\right )
\]

可以发现,置换的本质是一一映射,所以我们可以将上面的置换简记为 \(f=\{a_1,a_2,\cdots,a_n\}\),其中 \(f(i)=a_i(1<=i<=n)\)。从这种映射的角度来看,置换是可以复合的。如果 \(f=\{a_1,a_2,\cdots,a_n\},g=\{b_1,b_2,\cdots,b_n\}\),我们称 \(fg=\{b_{a_1},b_{a_2},\cdots,b_{a_n}\}\) 为 \(f\) 和 \(g\) 的复合。它表示我们先将一个数 \(i\) 映射到 \(f(i)\),再映射到 \(g(f(i))\)。比如,\(f=\{1,3,4,2\},g=\{3,2,1,4\}\),则 \(fg=\{3,1,4,2\}\),它表示 \(2\) 先映射到 \(f(2)=3\),这个 \(3\) 再映射到 \(g(3)=1\),所以总的来说,\(fg(2)=g(f(2))=1\)。

循环(permutation cycle)是一类特殊的置换,它表示一些元素有次序地交换位置。通常地,我们记置换\(\left(\begin{matrix} a_1 & a_2 & \cdots & a_{n-1} & a_n \\ a_2 & a_3 & \cdots & a_n & a_1\end{matrix}\right)\)的循环为 \((a_1,a_2,\cdots,a_n)\)。与置换类似,循环也有乘积。我们常用循环的乘积来表示置换,如\(\left(\begin{matrix} 1 & 2 & \cdots & k & k+1 & \cdots & n \\ 2 & 3 & \cdots & 1 & k+2 & \cdots & k+1\end{matrix}\right) = (1,2,\cdots,k)(k+1,\cdots,n)\)。虽然置换乘法是不可交换的,但我们应当发现,对不相交的循环,不论用什么方式相乘,其结果总是一样的。

那么置换和Pólya定理有什么关系呢?我们通过一道题目来阐述。

题目(等价类计数问题)在 \(2\times 2\) 的方格中,我们将每个方格涂成黑白两色。如果允许旋转,一共会有多少种方案?

分析 我们先考虑没有旋转的所有情况。有以下 \(16\) 种:

令方格的四个格子分别为 \(A_1,A_2,A_3,A_4\),分别对应坐标系中的四个象限。那么我们可以定义(顺时针)旋转集合 \(R=\{\) 旋转0°, 旋转90°, 旋转180°, 旋转270° \(\}=\{(A_1)(A_2)(A_3)(A_4),(A_1,A_2,A_3,A_4),(A_1,A_3)(A_2,A_4),(A_4,A_3,A_2,A_1)\}\)。通过这个集合我们可以定义一个等价关系:(顺时针)旋转后相等。我们将所有等价的元素分成一个集合,称之为一个等价类,则现在题目要求的就是\(R\)所定义的不同的等价类的个数。我们有结论:

引理(Burnside引理):如果对于一个操作集合 \(R\) 中的操作 \(f\),某个元素 \(s\) 在 \(f\) 操作后不变,则称 \(s\) 为 \(f\) 的不动点。若将 \(f\) 的不动点数目记为 \(C(f)\),则由 \(R\) 定义的所有等价类数量为所有 \(C(f)\)的平均值。

那么本题中就有所有等价类数目为 \((16 + 2 + 4 + 2) / 4 = 6\) 个。

现在来考虑如何求 \(C(f)\)。不难发现,如果一个操作 \(f\) 被分解为 \(m(f)\) 个循环,则每个循环内元素所染的颜色均相同。那么有 \(C(f)=2^{m(f)}\)。推广开来,如果不止 \(2\) 种颜色,而是 \(k\) 种,则有 \(C(f)=k^{m(f)}\)。代回Burnside引理就得到Pólya定理。

定理(Pólya定理):如果对于一个操作集合 \(R\) 中的操作 \(f\),可被分解为 \(m(f)\) 个循环,且每个元素最多有 \(k\) 种颜色,则由 \(R\) 定义的所有等价类数量为所有 \(k^{m(f)}\)的平均值。

例题 Pólya定理模板 题目大意:\(t(t<=10^3)\) 组数据,每组数据给定一个有 \(n(n<=10^9)\) 个点的环,染 \(n\) 种颜色,在只考虑旋转的情况下,有多少种不同的染色数?

分析 如果旋转 \(i\) 个距离,则 \(0,i,2i,\cdots\) 构成一个长度为 \(n/gcd(i,n)\) 的循环。一共有 \(n/(n/gcd(i,n))=gcd(i,n)\) 个循环,因此答案为 \(\frac1n\sum_{i=1}^n n^{gcd(i,n)}\)。容易发现,这样做肯定是要超时的。所以我们愉快地推一波式子。

\[\begin{aligned}
& \frac1n\sum_{i=1}^n n^{gcd(i,n)} \\
&=\frac1n\sum_{d|n}n^d\sum_{i=1}^n[gcd(i,n)=d] \\
&=\frac1n\sum_{d|n}n^d\sum_{i=1}^{\frac{n}{d}}[gcd(i\cdot d,n)=d] \\
&=\frac1n\sum_{d|n}n^d\sum_{i=1}^{\frac{n}{d}}[gcd(i,n/d)=1] \\
&=\frac1n\sum_{d|n}n^d\varphi(\frac{n}{d})
\end{aligned}
\]

然后就可以瞎搞暴力了。

#include<bits/stdc++.h>
using namespace std; typedef long ll;
const ll mod = 1E+9 + 7; ll T, n, ans; ll Phi(ll x)
{
ll res = 1;
for(ll i = 2; i * i <= x; ++i) {
if(!(x % i)) {
x /= i, res = res * (i - 1) % mod;
while(!(x % i)) x /= i, res = res * i % mod;
}
} if(x != 1) res = res * (x - 1) % mod;
return res;
} ll QuickPow(ll a, ll b)
{
ll res = 1; a %= mod;
while(b) {
if(b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
} int main()
{
scanf("%lld", &T);
while(T--) {
ans = 0; scanf("%lld", &n);
for(ll i = 1; i * i <= n; ++i) {
if(n % i) continue; ans = (ans + (Phi(n / i) * QuickPow(n, i - 1))) % mod;
if(i * i != n) ans = (ans + (Phi(i) * QuickPow(n, n / i - 1))) % mod;
}
printf("%lld\n", ans);
}
}

置换及Pólya定理的更多相关文章

  1. 置换群 Burnside引理 Pólya定理(Polya)

    置换群 设\(N\)表示组合方案集合.如用两种颜色染四个格子,则\(N=\{\{0,0,0,0\},\{0,0,0,1\},\{0,0,1,0\},...,\{1,1,1,1\}\}\),\(|N|= ...

  2. 【BZOJ1478】Sgu282 Isomorphism Pólya定理神题

    [BZOJ1478]Sgu282 Isomorphism 题意:用$m$种颜色去染一张$n$个点的完全图,如果一个图可以通过节点重新标号变成另外一个图,则称这两个图是相同的.问不同的染色方案数.答案对 ...

  3. 数学:Burnside引理与Pólya定理

    这个计数定理在考虑对称的计数中非常有用 先给出这个定理的描述,虽然看不太懂: 在一个置换群G={a1,a2,a3……ak}中,把每个置换都写成不相交循环的乘积. 设C1(ak)是在置换ak的作用下不动 ...

  4. Burnside引理&Pólya定理

    Burnside's lemma 引例 题目描述 一个由2*2方格组成的正方形,每个格子上可以涂色或不涂色, 问共有多少种本质不同的涂色方案. (若两种方案可通过旋转互相得到,称作本质相同的方案) 解 ...

  5. @总结 - 12@ burnside引理与pólya定理

    目录 @0 - 参考资料@ @1 - 问题引入@ @2 - burnside引理@ @3 - pólya定理@ @4 - pólya定理的生成函数形式@ @0 - 参考资料@ 博客1 @1 - 问题引 ...

  6. Pólya 定理学习笔记

    在介绍\(Polya\) 定理前,先来介绍一下群论(大概了解一下就好): 群是满足下列要求的集合: 封闭性:即有一个操作使对于这个集合中每个元素操作完都使这个集合中的元素 结合律:即对于上面那个操作有 ...

  7. Burnside 引理与 Pólya 定理

    群 群的定义 在数学中,群是由一种集合以及一个二元运算所组成的,符合"群公理"的代数结构. 一个群是一个集合 \(G\) 加上对 \(G\) 的二元运算.二元运算用 \(\cdot ...

  8. 【POJ2154】Color Pólya定理+欧拉函数

    [POJ2154]Color 题意:求用$n$种颜色染$n$个珠子的项链的方案数.在旋转后相同的方案算作一种.答案对$P$取模. 询问次数$\le 3500$,$n\le 10^9,P\le 3000 ...

  9. 【POJ2409】Let it Bead Pólya定理

    [POJ2409]Let it Bead 题意:用$m$种颜色去染$n$个点的环,如果两个环在旋转或翻转后是相同的,则称这两个环是同构的.求不同构的环的个数. $n,m$很小就是了. 题解:在旋转$i ...

随机推荐

  1. HTML常用技巧

    1. 为网页链接添加快捷键:accesskey 属性 https://zhidao.baidu.com/question/2267343500557447508.html 2. 键盘事件设置快捷键:h ...

  2. XGBoost对波士顿房价进行预测

    import numpy as np import matplotlib as mpl mpl.rcParams["font.sans-serif"] = ["SimHe ...

  3. Flask总结篇

    1 Flask框架的优势? 相信做Python这一块的程序员都有听说这三个框架,就像神一样的存在,每一个框架的介绍我就不写出来了,感兴趣可以自己百度了解了解!下面我就说正事 Django:Python ...

  4. json转义问题

    后端程序接受前台传递过来json 1正常json没有问题 比如  {"id":21,"userName":"2张天师","phon ...

  5. 关于PATCH与PUT的区别

    两者的区别:PATCH:更新部分资源,非幂等,非安全PUT:更新整个资源,具有幂等性,非安全注:幂等性:多次请求的结果和请求一次的结果一样安全性:请求不改变资源状态 举个两者明显区别的例子(我对两者定 ...

  6. Java8一Lambda与函数式接口

    关于Lambda表示在工作学习中会经常用到,但并没有全面的去了解.在这里做一个较为详细的记录供以后学习查阅.主要参考Java 8 Lambda 表达式 引言 Java8之前,我们在使用Runnale创 ...

  7. 【UVA1505】 Flood-it!(IDA*)

    题目链接 IDA*,估价函数为当前除了左上角的连通块以外颜色的种类数,因为每次最多消去一个颜色. 维护位于当前连通块的边缘但颜色不同的点,每次从这些点拓展就行. #include <cstdio ...

  8. Layui学习笔记(一)—— 关于模块的扩展

    在使用layui的时候,总有官方自带模块不够用想自己扩展的时候,这时候我们就需要扩展模块了. 模块扩展有两种: (一)普通地扩展 layui.define( function (exports) { ...

  9. js原型,原型链

    先铺垫下原型规则: 1.所有的引用类型(数组,对象,函数)都具有对象特性,可自由扩展属性(出了null外) 2.所有的引用类型(数组,对象,函数)都有一个__proto__属性(隐式原型),属性值是一 ...

  10. iOS 关键词assign、strong、copy、weak、unsafe_unretained

    关键词assign.strong.copy.weak.unsafe_unretained 影响: 是否开辟新的内存 是否有引用计数增加 strong 指向并拥有该对象.其修饰的对象引用计数会 +1,该 ...