[组合数学] 圆排列和欧拉函数为啥有关系:都是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 ...
随机推荐
- 简单使用媒体查询@media
@media 可以针对不同的屏幕尺寸设置不同的样式,特别是如果你需要设置设计响应式的页面,@media 是非常有用的. 那媒体查询该如何使用呢? 一.铺垫 1.首先我们在使用 @media 的时候需要 ...
- Django 设置admin后台表和App(应用)为中文名
设置表名为中文 1.设置Models.py文件 class Post(models.Model): name = models.CharField() --省略其他字段信息 class Meta: v ...
- Vue + Element-ui实现后台管理系统(3)---面包屑 + Tag标签切换功能
面包屑 + Tag标签切换功能 有关后台管理系统之前写过两遍博客,看这篇之前最好先看下这两篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-system 1.V ...
- redis crackit入侵事件总结
今天发现服务器有异常进程/opt/yam/yam,上网搜了搜,是由于redis未授权引起的入侵,查了些资料,这里做下总结. 1. 现象 有以下其一现象就要注意是否被入侵 crontab -l 可以看到 ...
- 第一行Kotlin系列(三)Intent 向上一页返回数据onActivityResult的使用
1.MainActivity.kt跳转处理 声明全局的按钮对象 private lateinit var button8: Button 实例化按钮对象 button8 = findViewById( ...
- Python脚本:linux上将筛选的文件夹复制到另一个目录,保存目录结构以及文件和文件夹操作方法
import os,shutil def newDir(dir_path): if not os.path.exists(dir_path): os.makedirs(dir_path) def co ...
- Zookeeper入门一篇就够了
谈点分布式 什么是分布式呢? 起初,我们的应用流量比较小,所有东西全部部署在一个服务器,比如全部丢给一个tomcat来处理,顶多做一个tomcat的多节点部署多分,再挂一台Nginx做一下负载均衡就O ...
- 黑马程序员_毕向东_Java基础视频教程——if 语句(单条语句)(随笔)
if 语句(单条语句) 格式(三种) [注意]:如果 if 控制的语句只有一条,则 这个 { } 括号可以不写 if (条件表达式) { 执行语句; } class Test{ public stat ...
- STM32学习笔记——USART
STM32的USART组件支持异步.同步.单线半双工.多处理器.IrDA.LIN.SmartCard等模式,本文介绍的是异步即UART模式. 总线通信有三种模型:轮询.中断和DMA.DMA对我来说是陌 ...
- wepy+vant-weapp踩坑记
最近用了几个月的wepy框架,碰到了挺多问题,这里总结一下 1.clone的代码无法再本地运行,wepy报错 解决方案: 执行命令 : `npm install wepy-cli@1.6.1-alph ...