1. 程式人生 > >poj2409(polya 定理模板)

poj2409(polya 定理模板)

構造 hide pan int names end col return nbsp

題目鏈接: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 }
View Code

poj2409(polya 定理模板)