poj2409(polya 定理模板)
题目链接:http://poj.org/problem?id=2409
题意:输入 m, n 表示有 m 种颜色,要构造一个长度为 n 的手环,旋转和对称的只算一种,问能组成多少个不同的手环.
思路:polya 模板
详见:http://m.blog.csdn.net/thchuan2001/article/details/65653855
代码:
1 #include <iostream> 2 #include <math.h> 3 using namespace std; 4 5 int gcd(int a, int b){ 6 return b == 0 ? a : gcd(b, a % b); 7 } 8 9 int polya(int m, int n){ 10 int ans = 0; 11 for(int i = 0; i < n; i++){ 12 ans += pow(m, gcd(n, i));//第i次旋转的循环节数为gcd(n,i) 13 } 14 if(n & 1){ 15 for(int i = 0; i < n; i++){ 16 ans += pow(m, n / 2 + 1);//共有n个循环节数均为n/2+1的置换 17 } 18 }else{ 19 for(int i = 0; i < n / 2; i++){ 20 ans += pow(m, n / 2) + pow(m, n / 2 + 1);//有两种置换,第一种循环节数均为n/2,第二种循环节数均为n/2+1 21 } 22 } 23 return ans; 24 } 25 26 int main(void){ 27 int n, m; 28 while(cin >> m >> n && m + n){ 29 cout << polya(m, n) / (n << 1) << endl; 30 } 31 return 0; 32 }
我就是我,颜色不一样的烟火 --- geloutingyu