神题神题~~被他折磨了一下午,不过大大加深了我对 Pólya 和 Burnside 的理解。
初学 Pólya 和 Burnside 的时候发现数学太重口味了,背了个公式草草走人,今天为了做这道题可是费了血本把组合数学的书翻出来看,哎,都怪组合数学课上YY去了。
花了1个小时的时间强啃,总算是有了些收获,小小的总结下。
首先是几个名词:
1.着色方案;
2.置换,置换群;
3.不动置换,对于某个着色方案,置换之后仍为自己的置换,叫不动置换;
4.稳定核,对于某种着色方案的不动置换的集合。
对于所有着色方案,有些是同构的,而且同构是具有传递性的,比如a和b同构,b和c同构,那么a和c是同构的。
一个比较直观的想法:所有本质不同的着色方案=∑(1/和该方案同构的方案数)。
因此求出每个方案与之同构的方案数就是当前的任务。
定理:与方案同构的方案数=(置换群个数)/(稳定核个数);
这是怎么得出来的?
假设 f 为一个置换,c 为一个着色方案,g 为 c 的一个不动置换。
∵g*c=c,f*c=f*c
∴ f*g*c=f*c
可以得,f 和 f*g 这两个置换作用在 c 上的效果是一样的。
所以和 f 置换效果一样的置换一共有(c的稳定核个数)个,对于置换群中每一个置换作用在 c 上产生的新着色方案,这些新着色方案与 c 同构,且每一个新着色方案都被重复计算了 (稳定核个数)次,所以
定理:与 c 的方案数=(置换群个数)/(稳定核个数) 得证。
再一步步带上去,可得
所有本质不同的着色方案=∑((稳定核个数)/(置换群个数)){所有着色方案}。
一一计算每一个着色方案的稳定核个数是不可取的,相反的,考虑每一个置换会是多少个着色方案的不动置换,这样就变成了我们最熟悉的式子:∑C(g)/|G|。
对于最普通的着色问题,式子就可以简化成:∑MP(g)/|G|。
现在回到这道题:每个置换实际上相当于是把这个环平均分成很多份(链)然后相邻的链相等就算同构。
我们需要计算的是每一个置换会是多少个着色方案的不动置换,因为是不动置换,所以分成的很多链式相等的,因此我们只需要考虑一条短链的情况就可以了。
问题转化成为:一条长度为L的链,相邻两个珠子颜色有限制,求方案数。
对于L很大的情况,这就是个经典的矩阵连乘的题目了。
因为N比较大,考虑使用欧拉函数进行优化,枚举置换的循环节个数L,那么和他等价的置换群一共有 phi(N/L)种,我们需要枚举的仅仅是N的约数个数,算法复杂度为 O(N0.5logNM3)。