poj2409(polya 定理模板)
阿新 • • 發佈:2017-10-01
構造 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 == 0View Code? 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 }
poj2409(polya 定理模板)