题目大意,用三种颜色的珠子组成总共有n个珠子的项链,问总共有多少种不同组法。2种项链旋转,翻转后能变为同一种的,看做是相同的
很裸的题。浅谈一下找循环群的方法。
1.旋转 不妨设只能顺时针旋转。那么有不转,转1颗珠子……转n-1颗珠子,假设转i颗珠子,那么有 gcd(n,i)个循环,每个循环的长度都是n/gcd(n,i),这个结论经常用得到;
2.翻转 这个要分奇偶,
奇数 只能对称轴穿过某颗珠子,循环个数为(n+1)/2,共有n个这样的循环群
偶数 对称轴过两个珠子,循环个数(n+2)/2,共有n/2个这样的循环群
对称轴过两个相邻珠子的,循环个数n/2,共有n/2个这样的循环群
用vs写得代码,编译好严格。。要加好多强制转换,代码如下
// PKU_1286.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<stdio.h>
#include<math.h>
__int64 gcd(__int64 a,__int64 b)
{
if(a%b==0)
return b;
else
return gcd(b,a%b);
}
int main()
{
__int64 n,i;
while(scanf("%I64d",&n),n!=-1)
{
__int64 ans=0;
if(n!=0)
{
for(i=1;i<=n;i++)
{
ans+=(__int64)(pow(3.0,(int)gcd(n,i)));
}
if(n&1)
{
ans+=(__int64)(pow(3.0,(int)(n+1)/2)*n);
}
else
{
ans+=(__int64)(pow(3.0,(int)n/2)*(n/2));
ans+=(__int64)(pow(3.0,(int)(n+2)/2)*(n/2));
}
ans/=(2*n);
}
printf("%I64d\n",ans);
}
return 0;
}