高中时候曾经想法推到同分异构体个数,希望考试能用比较高端的方法熏迅速解出来(但是没有找到),几年过去了这个疑虑终于解开了,用到的叫波利亚计数(Pόlya计数定理)是组合数学的核心知识点,这里只说用法,证明比较复杂的略
有如下问题:
1. 用两种颜色去染色一圈的6个棋子,旋转相同算一个有多少种染法
2. 给定一个苯环,问用一个羟基一个羧基取代苯环氢原子,理论上有多少种取代方法,忽略化学上的冲突。
3. 有k1颜色珠子n1个,k2颜色珠子n2个,k3颜色珠子n3个。。。。kN颜色珠子nN个,问能穿成多少种不同的项链。
这个博客讲的比较好https://blog.csdn.net/ojshilu/article/details/15378645
要知道波利亚计数,一定要了解一下理论
以棋子问题为例,有6个棋子构造一个2*6的矩阵
表中第一行表示为位置序号,第二行表示棋子序号,初始是:记作a1
1 |
2 |
3 |
4 |
5 |
6 |
1 |
2 |
3 |
4 |
5 |
6 |
顺时针旋转一个单位后,记作a2
1 |
2 |
3 |
4 |
5 |
6 |
6 |
1 |
2 |
3 |
4 |
5 |
顺时针旋转一个单位后,记作a3
1 |
2 |
3 |
4 |
5 |
6 |
5 |
6 |
1 |
2 |
3 |
4 |
顺时针旋转一个单位后,记作a4
1 |
2 |
3 |
4 |
5 |
6 |
4 |
5 |
6 |
1 |
2 |
3 |
顺时针旋转一个单位后,记作a5
1 |
2 |
3 |
4 |
5 |
6 |
3 |
4 |
5 |
6 |
1 |
2 |
顺时针旋转一个单位后,记作a6
1 |
2 |
3 |
4 |
5 |
6 |
2 |
3 |
4 |
5 |
6 |
1 |
置换:以上是集合内部元素位置改变(总元素不变,整体经过旋转,翻折,对称等操作)的产物,用矩阵表示某个状态的每个元素,这个矩阵称为置换
置换除了矩阵表示,为了表示出内部元素位置是怎么变动的
a1=(1) (2) (3) (4) (5) (6) 代表了1的位置是1,2的位置是2,等循环,6个括号代表有6个循环
a2=(1,6,5,4,3,2),代表了1的位置是6,6位置是5…最后一直到1,只有1个循环
a3=(1,5,3)(2,6,4) 代表了1到5到3到1 和 2到6到4到2,2个循环
a4=(1,4)(2,5)(3,6)
a5=(1,3,5)(2,4,6)
a6=(1,2,3,4,5,6)
用c代表循环个数
c1=6,c2=1,c3=2,c4=3,c5=2,c6=1
置换群:由置换组成的群,所谓群可以理解成,集合再组成的集合。
这里设置换群是G G=(a1,a2,a3,a4,a5,a6),|G|表示G元素个数,这里|G|=6
设置换群G={a1,a2,a3,…an }是N={1,2,...,n}上的置换群,现用m种颜色对这N个点染色,则不同的染色方案数为:
CNT=(m^c1+m^c2+…+m^cn)/|G|=( )/n
这其中没有说明m种颜色每个颜色取多少个这个条件,意味着CNT是颜色数量任意取得结果。
6个棋子圆环染2种色,有14种(ooxoxx和xxoxoo是两种)
找置换是波利亚计数关键,这个要从题目条件看,比如经过旋转算作同一个,那么就如例子中6个棋子,如果经过旋转和翻折对称都算同一个,那么还要加上以某个线为对称轴翻折的结果去求置换。
而且求置换往往需要其他数学知识。
数据较小(<100)可以开个数组寻找循环节数量(复杂度n*n),但是如果是1e5以上的数据就不行了,这里可以找规律,因为只说了旋转算同一种,旋转的置换有n个,第i个置换循环节数ci时gcd(n,i),当然这里不能把ci加和,因为要算m^ci之和,应该把ci分类,这样能用sqrt(n)*logn的时间求得。
关于[gcd(1,n),gcd(n,n)]这区间的数字分类,是数学题老套路,参考我的其他文章:最大公约数前缀和。
类似中心对称,按照n分奇数偶数,
奇数:按照每个点翻折,循环节是(n+1)/2,有n个
偶数:分为2种。按照某2个点翻折:循环节是(n+2)/2,有n/2个; 按照某个中轴线翻折:循环节是n/2,有n/2个。总共也是n个
poj 1286
poj2154
poj2409
Hdu1812
更新。。。。