听大佬们说了这么久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. Coursera,Udacity,Edx 课程列表(更新ing)

    Coursera,Udacity,Edx 课程列表(更新ing) Coursera有很多特别好的课程,平时没有机会听到国外大牛的课程,通过Coursera算是可以弥补一下吧,国外的课程普遍比国内的老师 ...

  2. LeetCode 84. 柱状图中最大的矩形(Largest Rectangle in Histogram)

    84. 柱状图中最大的矩形 84. Largest Rectangle in Histogram

  3. 不借助其他任何软件防止QQ被盗的小技巧

    分享一个小技巧(防止QQ被盗号): 在登录的时候前面加个0,点击登录,如果显示账号不存在,是因为你没有在添加或注册账号这儿登录,也就是切换账号.PC端也可以,如下图:                 ...

  4. 【RocketMQ源码学习】- 4. Client 事务消息源码解析

    介绍 > 基于4.5.2版本的源码 1. RocketMQ是从4.3.0版本开始支持事务消息的. 2. RocketMQ的消息队列能够保证生产端,执行数据和发送MQ消息事务一致性,而消费端的事务 ...

  5. Spring的并发问题——有状态Bean和无状态Bean

    一.有状态和无状态 有状态会话bean   :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”:一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束.即每 ...

  6. C++—多态与继承

    一.基本概念 1.类的继承,是新的类从已有类那里得到已有的特性.或从已有类产生新类的过程就是类的派生.原有的类称为基类或父类,产生的新类称为派生类或子类. 2.派生类的声明: class 派生类名:继 ...

  7. python学习-66 面向对象3 - 多态

    多态 1.什么是多态 由不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同. 举例: class H2O: def __init__(self,type,tem): self.type = ty ...

  8. LeetCode第152场周赛(Java)

    这算是我第一次正式参加 LeetCode 的周赛吧.通过两道题.意料之中(通过上次模拟可以看出来).总的来说,脑袋还是不太灵光.想的有点慢.全球第一名 0:10:19 就全部通过...感觉我的智商被狠 ...

  9. Python简介及开发环境搭建

    Python简介 Python是一门动态解释性的强类型定义的计算机程序设计语言,是一种完全面向对象的语言,由荷兰人"龟叔"-Guido van Rossum于1989年开发,于19 ...

  10. redis数据结构和常用命令

    redis常用数据结构 String 最简单的K_V,value可以是数字或者字符串,使用场景:微博数.普通计数,命令:get set incr(加1) decr(减1) mget(获取多个值),se ...