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

 

你可能感兴趣的:(poj)