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了,不知道只有一颗珠子的时候不输出颜色个数还有什么情况啊?
参考:http://hi.baidu.com/lewutian/blog/item/c75dff06c4693f6a03088100.html
上代码:
昨天看了一遍简单群论,又看了一点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 1286 Necklace of Beads & poj 2409 Let it Bead(初涉polya定理)
- POJ 2409 Let it Bead (Polya计数)
- POJ 2409 Let it Bead(Polya计数原理)
- POJ 2409 Let it Bead(Polya定理)
- POJ 2409 Let it Bead (Polya计数)
- POJ 2409 Let it Bead [置换群 Polya]
- POJ 2409 Let it Bead (Polya定理)
- [Polya] POJ 2409 Let it Bead
- POJ 2409 Let it Bead ACM Polya
- POJ 2409 Let it Bead (Polya) .
- poj 1286 Necklace of Beads & poj 2409 Let it Bead(初涉polya定理)
- POJ 2409 Let it Bead【polya 计数法,burnside定理】
- POJ 2409 Let it Bead (Polya定理)
- POJ 2409 Let it Bead(Polya简单应用)
- 置换群Polya定理(poj 2409: Let it Bead)
- poj 2409 Let it Bead(polya定理)
- POJ 2409-Let it Bead(Polya定理-旋转+翻转 串项链)
- Let it Bead (POJ - 2409) (polya计数原理)
- poj 2409 Let it Bead(polya)
- poj 2409 Let it Bead(polya 定理)