Necklace of Beads
Description
Beads of red, blue or green colors are connected together into a circular necklace of n beads ( n < 24 ). If the repetitions that are produced by rotation around the center of the circular necklace or reflection to the axis of symmetry are all neglected, how many different forms of the necklace are there?
![](https://i-blog.csdnimg.cn/blog_migrate/ef14d94bd1c6c38e0f0bb54a7967d6e1.jpeg)
Input
The input has several lines, and each line contains the input data n.
-1 denotes the end of the input file.
-1 denotes the end of the input file.
Output
The output should contain the output data: Number of different forms, in each line correspondent to the input data.
Sample Input
4 5 -1
Sample Output
21 39
Source
polya定理。
旋转置换:共有n种置换,每种置换有gcd(i,n)个循环节,其中0<=i<=n。
对称置换:
若n为奇数,共有n种置换,每种置换n/2+1个循环节。
若n为偶数,有两种置换方式,一种是某两个珠子在对称线上,共有2/n种置换,每种置换有2/n+1个循环节。另一种是没有珠子在对称线上,共有2/n种置换,每种置换有n/2个循环节。
代码如下:
#include<stdio.h>
#include<math.h>
int gcd(int a, int b) {
if (!b)
return a;
return gcd(b, a % b);
}
void polya(int n) {
double sum = 0.0;
if (n) {
for (int i = 0; i < n; i++)
sum += pow(3.0, gcd(i, n));
if (n % 2)
for (int i = 0; i < n; i++)
sum += pow(3.0, n / 2 + 1);
else
for (int i = 0; i < n / 2; i++)
sum += pow(3.0, n / 2) + pow(3.0, n / 2 + 1);
sum /= 2 * n;
}
printf("%.0lf\n", sum);
}
int main(void) {
int n;
while (scanf("%d", &n), n + 1) {
polya(n);
}
return 0;
}