Necklace of Beads(polya)

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; }

转载于:https://www.cnblogs.com/You-Change/p/3531126.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值