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;
}
}
浙公网安备 33010602011771号