大致题意:给你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基本是一个题,详细解释写在那个题了,用最简单的方法就能过,这里不再赘述了。
1 #include<cstdio> 2 #include<cmath> 3 using namespace std; 4 typedef __int64 ll; 5 int gcd(int a,int b){ 6 if(b==0){ 7 return a; 8 } 9 return gcd(b,a%b); 10 } 11 int c,s; 12 ll polya(){ 13 int i,j; 14 ll ans=0; 15 for(i=0;i<s;i++){ 16 ans+=(ll)pow(1.0*c,gcd(s,i)); 17 } 18 if(s%2){ 19 ans+=s*(ll)pow(1.0*c,s/2+1); 20 } 21 else{ 22 ans+=s/2*(ll)pow(1.0*c,s/2); 23 ans+=s/2*(ll)pow(1.0*c,s/2+1); 24 } 25 return ans/2/s; 26 } 27 int main(){ 28 while(scanf("%d%d",&c,&s)&&(c||s)){ 29 ll ans=polya(); 30 printf("%I64d\n",ans); 31 } 32 return 0; 33 }