m种颜色给n个珠子染色,n个珠子围成了一圈,具有对称性的计数,裸的polya。
#include <stdio.h>
int m,n;
int gcd(int a, int b)
{
if(b == 0) return a;
return gcd(b,a%b);
}
int pow(int a, int b)
{
int ret = 1;
while(b)
{
if(b&1) ret = ret*a;
a = a*a;
b >>= 1;
}
return ret;
}
int main()
{
int sum;
while(scanf("%d %d",&m,&n) && m+n)
{
sum = 0;
//n种旋转的情况
for(int i = 1; i <= n; ++i)
{
int tmp = gcd(n,i);
sum += pow(m,tmp);
}
//反转的情况
if(n&1)
sum += n*pow(m,(n+1)/2);
else
{
sum += (n/2)*pow(m,(n+2)/2);
sum += (n/2)*pow(m,n/2);
}
sum = sum/(2*n);//旋转有n个置换,翻转有n个置换
printf("%d\n",sum);
}
return 0;
}