poj 2409 Let it Bead——Polya

这是我的第一道polya噢~~~~

昨天看了一遍简单群论,又看了一点burnside和polya,今天把昨天看的又复习了一遍,就开了一道题开始做

大意:给你一个有s个珠子的手镯,再给你c种颜色,让你给手镯染色,问能染出多少种不同颜色的手镯。

先开始就想到了旋转的情况,没有想到还有翻转的情况,因为我的书上没有讲翻转的情况。后来跟队友讨论了一下,原来还有两串珠子本来一样,但是旋转不能重合的情况!!所以还要算旋转的情况

旋转的情况:

对每一个s,有s种旋转方法,i表示转几个珠子,那么循环的个数为gcd(s,i)至于为什么有这个结论,我现在还没想清楚……

翻转的情况:

当s是偶数时,分按边翻转和按点翻转

                  按边:有n/2种翻法,每种翻法的循环个数都为n/2

                  按点:有n/2种翻法,每种翻法的循环个数为n/2+1

当s是奇数时,只有以一边中心和一点为对称轴的翻法,有n种,每种翻法的循环个数都为n/2+1

所以置换群中置换的个数为2*s

只是做了一道polya,就感觉到置换群有多难确定了,唉……

写的时候才发现pow函数是以double为参数的,强制转换写得纠结死,最后干脆自己写了一个power函数……

后来交的时候wa了几次,出了脑残打掉一个len*以外,还有以下这段程序出了问题,删掉以后就A了,不知道只有一颗珠子的时候不输出颜色个数还有什么情况啊?

if(len==1)
{
printf(
"%d\n",c);
continue;
}

参考:http://hi.baidu.com/lewutian/blog/item/c75dff06c4693f6a03088100.html

上代码:

a27400 2409 Accepted 732K 0MS G++ 1182B 2011-08-22 19:36:31
#include <cstdio>
#include
<cstring>
#include
<cstdlib>
#include
<cctype>
#include
<cmath>
#include
<time.h>
#include
<set>
#include
<map>
#include
<stack>
#include
<queue>
#include
<cstring>
#include
<bitset>
#include
<vector>
#include
<deque>
#include
<list>
#include
<sstream>
#include
<iostream>
#include
<functional>
#include
<numeric>
#include
<algorithm>
#define eps 1e-9
#define CLR(arr,v) memset(arr,v,sizeof(arr));
#define FOR(i,s,e) for((i)=(s);(i)<=(e);i++)
#define sq(x) ((a)*(a))
#define LL long long
#define DB double
#define LDB long double
#define pb push_back
using namespace std;

int gcd(int a,int b)
{
if(b==0)
return a;
else return gcd(b,a%b);
}

int power(int a,int n)
{
int res=1;
int i;
FOR(i,
1,n)
{
res
*=a;
}
return res;
}

int main(void)
{
ios::sync_with_stdio(
false);
int c,len;
while(cin>>c>>len)
{
if(!c&&!len)
break;
int G=2*len;
int total=0;
int i;
FOR(i,
0,len-1)
{
total
+=power(c,gcd(len,i));
}
if(len&1)
total
+=len*power(c,len/2+1);
else total+=(len/2)*power(c,len/2)+(len/2)*power(c,len/2+1);
total
/=G;
cout
<<total<<endl;
}
}
 

你可能感兴趣的:(poj)