标签:
Description
Input
Output
Sample Input
Sample Output
题目大意:
n个珠子串成一个圆,用三种颜色去涂色。问一共有多少种不同的涂色方法。
不同的涂色方法被定义为:如果这种涂色情况翻转,旋转不与其他情况相同就为不同。
解题思路:
Polya定理模版题。
对于顺时针长度为i的旋转,为pow(3, gcd(n,i);
对于翻转,当为奇数时,有:n*pow(3, n/2+1);
当为偶数时,有:n/2*pow(3.0,n/2)+n/2*pow(3.0,n/2+1);
一共有2*n种情况,最后要除以2*n
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <cmath> 6 using namespace std; 7 typedef long long LL; 8 int n; 9 LL Pow(LL a, LL b) // 手写long long 10 { 11 LL res = 1; 12 for (int i = 0; i < b; i++) 13 res *= a; 14 return res; 15 } 16 int gcd(int a, int b) 17 { 18 if (a == 0) 19 return b; 20 return gcd(b % a, a); 21 } 22 int main() 23 { 24 while (scanf("%d", &n) != EOF && n != -1) 25 { 26 if (n == 0) 27 { 28 printf("0\n"); 29 continue; 30 } 31 LL ans = 0; 32 for (int i = 1; i <= n; i++) 33 ans += Pow(3, gcd(i, n)); 34 35 if (n & 1) 36 { 37 ans += n * Pow(3, (n + 1) / 2); 38 } 39 else 40 { 41 ans += n / 2 * Pow(3.0, n / 2 + 1); 42 ans += n / 2 * Pow(3.0, n / 2); 43 //ans += n / 2 * (pow(3.0, n / 2 + 1) + pow(3.0, n / 2)); 44 } 45 printf("%I64d\n", ans / 2 / n); 46 } 47 return 0; 48 }
HDU 1817Necklace of Beads(置换+Polya计数)
标签:
原文地址:http://www.cnblogs.com/zhaopAC/p/5503336.html