题意:
let is bead (POJ 2409)
一串由n个珠子组成的项链,用c种颜色涂染,问能形成多少种不同项链?由旋转和翻转得来的算同一种。
思路:用polya 定理解决这个计数问题,关键是分析群中置换的个数和每个置换的循环节个数,分析题目中的两种置换群,一种是旋转置换,一种是翻转置换。
#include"iostream"
#include"cstdio"
#include"cmath"
using namespace std;
typedef long long LL;
LL gcd(LL a,LL b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
int main()
{
LL n,c;
while(scanf("%I64d%I64d",&c,&n)&&(n||c))
{
LL i,ans=0;
for(i=0;i<n;i++)
ans+=(LL)pow(c,gcd(n,i));
if(n&1)
ans+=n*(LL)pow(c,(n+1)/2);
else
ans+=n/2*(LL)(pow(c,n/2+1)+pow(c,n/2));
printf("%I64d\n",ans/(2*n));
}
}