Necklace of Beads--POJ 1286

1、题目类型:Polya定理、组合数学、置换群。

2、解题思路:Polya定理:(1)设G是p个对象的一个置换群,用k种颜色突然这p个对象,若一种染色方案在群G的作用下变为另一种方案,则这两个方案当作是同一种方案,这样的不同染色方案数为:

(2)置换及循环节数的计算方法:对于有n个位置的手镯,有n种旋转置换和n种翻转置换.
                                          对于旋转置换: c(fi) = gcd(n,i)  i为一次转过i颗宝石( i = 0 时 c=n;);
                                          对于翻转置换:如果n为偶数:c(f) = n/2 的置换有n/2个; 
                                                                            c(f) = n/2+1 的置换有n/2个;
                                                           如果n为奇数:c(f) = n/2+1.

3、注意事项:注意对于翻转置换过程中对于奇偶数情况的区分处理。

4、实现方法:

#include<iostream>
#include
<math.h>
using namespace std;

int Gcd(int a,int b)
{
return b?Gcd(b,a%b):a;
}

double Polgy(int n)
{
int i;
double sum=0,tmp;
if(n==0)
return 0;
//旋转置换的情况
for(i=1;i<=n;i++)
{
tmp
=Gcd(i,n);
sum
+=pow(3.0,Gcd(i,n));
}
//翻转置换的情况
if(n%2==0)
{
sum
+=pow(3.0,n/2+1)*n/2;
sum
+=pow(3.0,n/2)*n/2;
}
else
{
sum
+=pow(3.0,n/2+1)*n;
}
return sum/2/n;
}

int main()
{
int n;
while(cin>>n && n!=-1)
{
cout
<<(int)Polgy(n)<<endl;
}
}

 

posted @ 2010-10-05 09:54  勇泽  阅读(1478)  评论(0编辑  收藏  举报