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