您的位置:首页 > 其它

poj 2409 Let it Bead (组合数学 polya计数法)

2012-06-20 19:39 543 查看
大致题意:给你c种颜色的珠子,和一个长度为s(c,s<32)的项链,用这c种珠子串成这个项链,项链可以旋转和翻转,经过旋转和翻转所得的项链视为同一种项链,现在告诉你颜色总数c和项链的长度s,求共能组成几条不同的项链。

Time Limit : 2000/1000ms (Java/Other) Memory Limit : 20000/10000K (Java/Other)

                      


样例:

Sample Input

1 1
2 1
2 2
5 1
2 5
2 6
6 2
0 0

Sample Output

1
2
3
5
8
13
21

一看也是一个polya计数法的题,跟Problem 1286 Necklace of Beads基本是一个题,详细解释写在那个题了,用最简单的方法就能过,这里不再赘述了。


#include<cstdio>
#include<cmath>
using namespace std;
typedef __int64 ll;
int gcd(int a,int b){
if(b==0){
return a;
}
return gcd(b,a%b);
}
int c,s;
ll polya(){
int i,j;
ll ans=0;
for(i=0;i<s;i++){
ans+=(ll)pow(1.0*c,gcd(s,i));
}
if(s%2){
ans+=s*(ll)pow(1.0*c,s/2+1);
}
else{
ans+=s/2*(ll)pow(1.0*c,s/2);
ans+=s/2*(ll)pow(1.0*c,s/2+1);
}
return ans/2/s;
}
int main(){
while(scanf("%d%d",&c,&s)&&(c||s)){
ll ans=polya();
printf("%I64d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: