题意:给定一串由n个珠子组成的项链,用c种颜色涂染,问能形成多少种不同项链。
思路:Burnside算法。分析:
1.旋转.
考虑顺时针旋转i格的置换:
循环个数为gcd(n,i)
每个循环的长度为L=n/gcd(n,i)
2.翻转
考虑对称轴
***n为奇数. 只有一种对称轴, 即轴穿过一个点. 有[n/2]个循环长度为2, 还有一个循环长度为1(被穿过的点), V=C([n/2], [m/2]).
***n为偶数, 有两种翻转
轴每边n/2个点. 这样的置换有n/2个
轴穿两点, 每边n/2个点. 这样的置换也有n/2个
算法复杂度分析:很容易可以算出这个算法的时间复杂度为O(n)。
#include <stdio.h>
#include <string.h>
#include <math.h>
int m,n;
int gcd(int x,int y){
if (!y)
return x;
return gcd(y,x%y);
}
int main(){
while(scanf("%d %d",&m,&n) && (m+n)){
int i;
long long res = 0;
for (i = 0;i<n;i++)
res += pow(m,gcd(n,i));
if (n&1)
res += n*pow(m,n/2+1);
else
res += n/2*(pow(m,n/2)+pow(m,n/2+1));
printf("%lld\n",res/n/2);
}
return 0;
}