波利亚计数

波利亚计数

高中时候曾经想法推到同分异构体个数,希望考试能用比较高端的方法熏迅速解出来(但是没有找到),几年过去了这个疑虑终于解开了,用到的叫波利亚计数(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个棋子,如果经过旋转和翻折对称都算同一个,那么还要加上以某个线为对称轴翻折的结果去求置换。

而且求置换往往需要其他数学知识。

常见置换模型总结:

1.   n个珠子圆环用m种颜色染色,中心对称算同一种

数据较小(<100)可以开个数组寻找循环节数量(复杂度n*n),但是如果是1e5以上的数据就不行了,这里可以找规律,因为只说了旋转算同一种,旋转的置换有n个,第i个置换循环节数ci时gcd(n,i),当然这里不能把ci加和,因为要算m^ci之和,应该把ci分类,这样能用sqrt(n)*logn的时间求得。

关于[gcd(1,n),gcd(n,n)]这区间的数字分类,是数学题老套路,参考我的其他文章:最大公约数前缀和。

2.   n个珠子圆环用m种颜色染色,轴对称算同一种

类似中心对称,按照n分奇数偶数,

奇数:按照每个点翻折,循环节是(n+1)/2,有n个

偶数:分为2种。按照某2个点翻折:循环节是(n+2)/2,有n/2个; 按照某个中轴线翻折:循环节是n/2,有n/2个。总共也是n个

题目:

poj 1286

poj2154

poj2409

Hdu1812

更新。。。。

 

你可能感兴趣的:(题解,组合数学,数据结构与算法,竞赛)