Polya定理:
设G是一个p个对象的置换群,那么用k种颜色对p个对象进行染色!当一种方案在群G的作用下变为另外一种方案,那么我们这个时候就认为这两个方案是一样的。那么在这种规定下不同的染色方案为:
n=(Ek^m(f))/|G|,其中m(f)是置换f的循环节。
Polya定理是基于Burnside定理和另外一个定理的,其中Burnside定理的通俗表达方法如下:
1)如果令C(f)表示在置换f的作用下,本质不变的着色方案数!那么可以证明的是“本质不同的着色方案数就是所有置换f下的C(f)的平均数”。
在Burnside的基础上,我们在介绍一个定理:
2)如果使用k种颜色给有限集合S着色,那么对于一个置换f,在该置换下本质不变的着色方案数就是C(f)=k^(m(f)),其中m(f)是置换f的循环节数。
基于上面的1)2)两个定理,便很明显的得到Polya定理。
#include <cstdio>
__int64 m[24];
void list()
{
m[0] = 1;
for(int i = 1; i < 24; ++i)
m[i] = m[i - 1]*3;
}
int gcd(int a,int b)
{
return b ? gcd(b,a%b):a;
}
int main()
{
int n;
__int64 ans;
list();
scanf("%d",&n);
while(n != -1)
{
ans = 0;
if(n == 0)
{
printf("%I64d\n",ans);
scanf("%d",&n);
continue;
}
for(int i = 1; i <= n; i++)
ans += m[gcd(i,n)];
if(n % 2 == 0)
ans += (m[n/2] + m[n/2 + 1])*n/2;
else
ans += n*m[(n + 1)/2];
printf("%I64d\n",ans/(n * 2));
scanf("%d",&n);
}
return 0;
}