首页 > 其他 > 详细

Necklace of Beads(polya)

时间:2014-01-23 21:44:41      阅读:394      评论:0      收藏:0      [点我收藏+]

Polya定理:

       设G是一个p个对象的置换群,那么用k种颜色对p个对象进行染色!当一种方案在群G的作用下变为另外一种方案,那么我们这个时候就认为这两个方案是一样的。那么在这种规定下不同的染色方案为:

n=(Ek^m(f))/|G|,其中m(f)是置换f的循环节。

       Polya定理是基于Burnside定理和另外一个定理的,其中Burnside定理的通俗表达方法如下:

      1)如果令C(f)表示在置换f的作用下,本质不变的着色方案数!那么可以证明的是“本质不同的着色方案数就是所有置换f下的C(f)的平均数”。

       在Burnside的基础上,我们在介绍一个定理:

       2)如果使用k种颜色给有限集合S着色,那么对于一个置换f,在该置换下本质不变的着色方案数就是C(f)=k^(m(f)),其中m(f)是置换f的循环节数。

       基于上面的1)2)两个定理,便很明显的得到Polya定理。


#include
<cstdio> __int64 m[24]; void list() { m[0] = 1; for(int i = 1; i < 24; ++i) m[i] = m[i - 1]*3; } int gcd(int a,int b) { return b ? gcd(b,a%b):a; } int main() { int n; __int64 ans; list(); scanf("%d",&n); while(n != -1) { ans = 0; if(n == 0) { printf("%I64d\n",ans); scanf("%d",&n); continue; } for(int i = 1; i <= n; i++) ans += m[gcd(i,n)]; if(n % 2 == 0) ans += (m[n/2] + m[n/2 + 1])*n/2; else ans += n*m[(n + 1)/2]; printf("%I64d\n",ans/(n * 2)); scanf("%d",&n); } return 0; }

Necklace of Beads(polya)

原文:http://www.cnblogs.com/You-Change/p/3531126.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!