题意:给定颜色种数和环上的珠子总数,问有多少种染色方案(通过旋转和翻转相同的算同一种)。这读不出来是硬伤。。。。
两种情况讨论:
1.旋转:循环节数 GCD(N,I);
2.翻转:<1> N%2 == 1 时,N个循环节数 (N+1)/ 2 个循环群。
<2> N%2 == 0 时,N / 2 个循环节数 (N+2)/ 2 , N / 2 个循环节数 N/ 2 个循环群。
Ps:人生苦短,证明神马的就算了吧。
#include <cstdio>
#include <string.h>
#include <math.h>
using namespace std;
inline int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int n,m,ans;
while(~scanf("%d%d",&m,&n),m+n)
{
ans=0;
for(int i=1;i<=n;i++)
{
int tmp=gcd(n,i);//旋转计算循环节
ans+=(int)(pow(m*1.0,tmp*1.0));
}
//计算翻转的循环群
if(n&1)
ans+=(int)(n*pow(m*1.0,(n+1)/2.0));
else
{
ans+=(int)((n/2)*pow(m*1.0,(n+2)/2.0));
ans+=(int)((n/2)*pow(m*1.0,n/2.0));
}
ans/=(2*n);
printf("%d\n",ans);
}
return 0;
}