题意 :给你3个颜色的n个珠子,能组成多少不同形式的项链。
思路 :这个题分类就是polya定理,这个定理看起来真的是很麻烦啊T_T.......看了有个人写的不错:
Polya定理:
(1)设G是p个对象的一个置换群,用k种颜色突然这p个对象,若一种染色方案在群G的作用下变为另一种方案,则这 两个方案当作是同一种方案,这样的不同染色方案数为:
;
(2)置换及循环节数的计算方法:对于有n个位置的手镯,有n种旋转置换和n种翻转置换.
对于旋转置换: c(fi) = gcd(n,i) i为一次转过i颗宝石( i = 0 时 c=n;);
对 于翻转置换: 如果n为偶数:c(f) = n/2 的置换有n/2个; c(f) = n/2+1 的置换有n/2个; 如 果n为奇数:c(f) = n/2+1.
#include <stdio.h> #include <math.h> #define LL long long using namespace std; LL gcd(LL a,LL b) { return b > 0 ? gcd(b,a%b) : a ; } int main() { LL c ; while (scanf("%lld", &c) != EOF) { if(c == -1) break ; if(c == 0) { printf("0\n") ;continue ; } LL sum = 0; for (LL i = 0 ; i < c ; i++) sum += pow(3, gcd(i, c)); if (c & 1)//奇数 sum += c * pow(3,c / 2 + 1); else sum += c / 2 * pow(3, c / 2) + c / 2 * pow(3, c / 2 + 1); sum /= c * 2; printf("%d\n", sum); } return 0; }