您的位置:首页 > 其它

poj 2409 Let it Bead——Polya

2011-08-22 19:35 288 查看
这是我的第一道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

上代码:

a274002409Accepted732K0MSG++1182B2011-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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: