[组合数学] 圆排列和欧拉函数为啥有关系:都是polya定理的锅
本文是一个笨比学习组合数学的学习笔记,因为是笨比,所以写的应该算是很通俗易懂了。
首先,我们考虑这么一个问题:你有无穷多的\(p\)种颜色的珠子,现在你想要的把他们中的\(n\)个以圆形的形状等间距的黏在一个可以旋转的圆盘上,求方案数。
然后,该问题的答案是 \(\frac{1}{n}\Sigma_{d|n}\phi(\frac{n}{d})p^d\) ,之中\(\phi()\)表示欧拉函数,下面解释一下为什么会出现这样一个数论函数。
首先,我们来复习一下polya定理:设一个序列上定义了一置换群\(|G|\),则对该序列做\(p\)种颜色的染色,方案数为\(\frac{1}{|G|}\Sigma^{|G|}_{i=1}p^{c_i}\),之中,\(|G|\)表示置换群大小(元素个数),\(c_i\)表示\(G\)中第\(i\)个置换的循环节数目。
那么在上述圆排列问题中,置换群也就是旋转变换的群了,注意这里不考虑翻转变换(这也是为什么题目里说要黏在可旋转的圆盘上的原因,这样就和翻转变换无关了)。那么显然,一个有\(n\)个珠子的圆环,一共对应了\(n\)种旋转变换,分别是从转\(1\)个单位到转\(n\)个单位(也就是不转,或者说转0个单位)的\(n\)种。因此,置换群大小\(|G|=n\)。
把\(|G|=n\)代入polya的公式里,得到\(ans=\frac{1}{n}\Sigma^{n}_{i=1}p^{c_i}\),那么对比真正的答案,接下来要说明的就是,为什么\(\Sigma^{n}_{i=1}p^{c_i}=\Sigma_{d|n}\phi(\frac{n}{d})p^d\)。
答案其实简单的有些弱智:合并同类项
\(\Sigma^{n}_{i=1}p^{c_i}\)这一式子里,其实有\(n\)项,那么很自然的一个想法就是:\(p^{c_i}\)是不是有不少重复的呢?事实上,是的,甚至只有\(\sqrt{n}\)种不同的\(p^{c_i}\)。
下面随便假设有个指数\(d\),那我想知道\(\Sigma^{n}_{i=1}p^{c_i}\),有几个\(p^d\)出现,也就是有几个\(c_i=d\)。回忆一下,这里\(c_i\)指的是第\(i\)个置换循环节的数量,这个要怎么求呢?这里需要一个简单但nb的小知识:
定理:对于\(n\)个珠子组成的圆的旋转变换来说,旋转了\(x\)个单位的变换对应的循环节数量有\(gcd(n,x)\)个,特别的,\(x=0\)时的循环节数量有\(n\)个。
不是证明的证明:考虑一个青蛙跳石头的问题,也就是有\(n\)块石头圆形排列,编号从\(0~n-1\),青蛙初始在\(pos\)的位置,每次青蛙会跳x步,那么青蛙跳一步就相当于\(pos=(pos+x)%k\),现在,请问青蛙一直跳下去,能踩到多少块石头。例如,\(n=6,x=4,pos=2\)时,青蛙就只能跳到编号为\(0,2,4\)的三块儿石头上。该问题的答案是\(\frac{n}{gcd(n,x)}\),这个证明略了,这是个比较好理解但不太好表述的数论结论。
那么,如果我们把旋转\(x\)个单位的置换群理解成每步跳\(x\)格的青蛙的话,就有循环节长度 = 青蛙能跳到的石头个数 = \(\frac{n}{gcd(n,x)}\) 。又因为从青蛙的例子里可以看出,该长度和青蛙初始的\(pos\)无关,所以所有的循环节长度都是\(\frac{n}{gcd(n,x)}\)。
进而,由于 n=循环节长度*循环节数量,就可以解得循环节数量为\(gcd(n,x)\),这就是旋转\(x\)对应置换的循环节数量。
书归正传,我们现在想知道的是,给定一个整数\(d\),有几个\(p^d\)出现在\(\Sigma^{n}_{i=1}p^{c_i}\)中,或者说多少个\(c_i=d\)。\(c_i\)的含义是循环节数量,也就是对于\(x\in [1,n]\),有多少个\(x\)对应的循环节数量是\(d\)。废话不多说,按刚才的结论,这也就是问有多少个\(x\)满足\(gcd(n,x)=d\)。
有多少个\(x\)满足\(gcd(n,x)=d\):这又是个数论问题,首先,变换成\(gcd(\frac{n}{d},\frac{x}{d})=1\),这个变换是科学的,因为\(gcd(n,x)=d\)中\(n\)和\(x\)一定是\(d\)的倍数。那么,有多少个\(x\)满足\(gcd(\frac{n}{d},\frac{x}{d})=1\)呢?由于满足\(gcd(\frac{n}{d},狗)=1\)的狗有\(\phi(n/d)\)个(根据欧拉函数的定义),而狗和\(x\)显然是一一对应的,所以这样的\(x\)就也有\(\phi(n/d)\)个。
所以,\(ans=\frac{1}{n}\Sigma^{n}_{i=1}p^{c_i}=\frac{1}{n}\Sigma_{d|n}\phi(\frac{n}{d})p^d\),这里\(d|n\)是因为根据上面推导,循环节数量\(d\)显然一定是\(n\)的因子。
[组合数学] 圆排列和欧拉函数为啥有关系:都是polya定理的锅的更多相关文章
- HDU5780 gcd (BestCoder Round #85 E) 欧拉函数预处理——分块优化
分析(官方题解): 一点感想: 首先上面那个等式成立,然后就是求枚举gcd算贡献就好了,枚举gcd当时赛场上写了一发O(nlogn)的反演,写完过了样例,想交发现结束了 吐槽自己手速慢,但是发了题解后 ...
- BZOJ 2190仪仗队【欧拉函数】
问题的唯一难点就是如何表示队长能看到的人数?如果建系,队长所在的点为(0,0)分析几组数据就一目了然了,如果队长能看到的点为(m,n),那么gcd(m,n)=1即m n 互质或者是(0,1),(1,0 ...
- XMU 1615 刘备闯三国之三顾茅庐(三) 【欧拉函数+快速幂+欧拉定理】
1615: 刘备闯三国之三顾茅庐(三) Time Limit: 1000 MS Memory Limit: 128 MBSubmit: 45 Solved: 8[Submit][Status][W ...
- 由 [SDOI2012]Longge的问题 探讨欧拉函数和莫比乌斯函数的一些性质和关联
本题题解 题目传送门:https://www.luogu.org/problem/P2303 给定一个整数\(n\),求 \[ \sum_{i=1}^n \gcd(n,i) \] 蒟蒻随便yy了一下搞 ...
- 【省选十连测之九】【DP】【组合计数去重】【欧拉函数】基本题
目录 题意: 输入格式: 输出格式: 数据范围: 思路: 嵌套题的转移 基本题的转移 Part1 Part2 Part3 代码 题意: 这是一个关于括号组合的题. 首先定义一道题是由'(',')',' ...
- HDU 5430 Reflect(欧拉函数)
题目: http://acm.hdu.edu.cn/showproblem.php?pid=5430 从镜面材质的圆上一点发出一道光线反射NNN次后首次回到起点. 问本质不同的发射的方案数. 输入描述 ...
- HDU 4483 Lattice triangle(欧拉函数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4483 题意:给出一个(n+1)*(n+1)的格子.在这个格子中存在多少个三角形? 思路:反着想,所有情 ...
- hdu 5279 Reflect phi 欧拉函数
Reflect Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://bestcoder.hdu.edu.cn/contests/contest_chi ...
- UVA12493 - Stars(求1-N与N互质的个数)欧拉函数
Sample Input 3 4 5 18 36 360 2147483647 Sample Output 1 1 2 3 6 48 1073741823 题目链接:https://uva.onlin ...
随机推荐
- Python3中正则的贪婪匹配模式
什么是贪婪模式 正则在进行匹配时,从开始位置查找最远的结束位置,这种模式称之为贪婪模式. 在进行HTML标签类似内容获取时,贪婪模式会导致整个内容的返回,需要使用非贪婪模式. 固定的书写规则 : .* ...
- 面向开发者的Docker实践
show me the code and talk to me,做的出来更要说的明白 本文源码,请点击learnSpringboot 我是布尔bl,你的支持是我分享的动力! 一. 引入 有开发经验的都 ...
- STM32 CubeIDE无法进行调试的问题
解决了由于一个很容易忽视的细节最终导致系统配置存在错误造成STM32 CubeIDE无法进行调试的问题: 文章目录 来龙去脉 解决方案 反思 来龙去脉 在享受CubeIDE快速和便捷的服务之后,生成了 ...
- Linux高性能服务器技术总结
文章目录 1 服务器简介 2 I/O复用技术 2.1 循环方式 2.2 select 方式 2.3 poll方式 2.4 epoll 方式 3 多线程方式 4 CPU多核并行计算 5 深度分析内核性能 ...
- 在dynamics 365 中,看字段的描述需要到系统字段设置里面才能看到,这里提供一种sql直接看字段和实体名描述的方法
1.在crm对应的主数据库执行下面存储过程: -- ============================================= -- Author: <Author,,Name& ...
- libevent到底是同步还是异步,是阻塞还是非阻塞
应该从不同角度看libevent的同步/异步.阻塞/非阻塞: IO数量的角度:select出来之前,会阻塞在一个io上,处理完成后再阻塞在下一个io上:之后就是把所有的io fd拿过来,都不阻塞,一个 ...
- Python --元组与列表的差异
· Python中的元组与列表类似,不同之处是元组的元素不能修改 · 元组使用小括号,不使用括号也可以,列表使用方括号 for example:
- javaweb学习之路(3)Cookie
1.Cookies的原理 1)首先浏览器向服务器发出请求. 2)服务器就会根据需要生成一个Cookie对象,并且把数据保存在该对象内. 3)然后把该Cookie对象放在响应头,一并发送回浏览器. 4) ...
- java ->Date、DateFormat、Calendar类
Date类概述 类 Date 表示特定的瞬间,精确到毫秒. 毫秒概念:1000毫秒=1秒 毫秒的0点: System.currentTimeMillis() 相当于Date d = new Date ...
- 萌新带你开车上p站(终极番外)
本文由“合天智汇”公众号首发,作者:萌新 0x01前言 这关其实和pwn关系不大,主要考察的都是linux下一些函数的操作,考察linux的基本功.涉及到的知识点包括一些经典的函数原型.IO重定向.文 ...