UVA 10294 项链与手镯 (置换)
Burnside引理:对于一个置换\(f\), 若一个着色方案\(s\)经过置换后不变,称\(s\)为\(f\)的不动点。将\(f\)的不动点数目记为\(C(f)\), 则可以证明等价类数目为\(C(f)\) 的平均值。
也就是对于置换群中的某一个置换\(f\),\(C(f)\)为所有着色方案中,那些经过置换\(f\) 可以互相转换(即等价)的着色方案数
因为一个置换可以拆成若干个循环,置换中的每个元素可以看成是一个结点,那么每个节点必有一个出度和入度,所以肯定会形成若干个环,在置换\(f\) 的不动点中,被分解成的每个环中,颜色都必须相同(因为通过置换他们可以相互抵达)。如果设一个置换中的循环节数量为\(m(f)\),那么\(C(f) = k^{m(f)}\) 其中 k 是着色数量。
UVA 10294 项链与手镯
刘汝佳白书146页
polya计数裸题
一共有两种置换,即旋转和翻转,项链只有第一种置换,手镯两种都有。设珠子编号为0~n-1.
旋转:
共有n-1种旋转方式的置换,第 i 种即旋转 i 颗珠子的间距,那么可以计算出来从0号珠子出发,要旋转\(lcm(i,n) / i\) 次可以转到最初的位置,那么这个循环长度为\(\frac{n}{gcd(i,n)}\) 。共该置换共有\(gcd(i,n)\) 个循环,所以旋转这类置换,共有\(a = \sum_{i=0}^{n-1}t^{gcd(i,n)}\) 个不动点
翻转
当 n 为奇数时(可以想正 n 边形的顶点),有 n 条对称轴,每条对称轴形成了\((n-1)/2\) 个长度为2的,1个长度为1的循环,即(n+1)/2个循环。这些置换的不动点总数为\(b=nt^{\frac{n+1}{2}}\)。
当 n 为偶数时,有两种对称轴。穿过珠子的对称轴有\(\frac{n}{2}\) 条, 各形成了\(n/2-1\) 个长度为2的循环和两个长度为1的循环;不穿过珠子的对称轴有 \(\frac{n}{2}\), 各形成了\(n/2\) 个长度为2的循环。这些置换的不动点总数为\(b=\frac{n}{2}(t^{n/2+1} + t^{n/2})\)
const int N = 50 + 5;
int n, t;
ll power[N];
ll gcd(int a,int b){
return b == 0 ? a : gcd(b, a % b);
}
int main() {
while(scanf("%d%d",&n,&t) == 2 && n){
power[0] = 1;
for (int i = 1; i <= n;i++)
power[i] = power[i - 1] * t;
ll a = 0;
for (int i = 0; i < n;i++)
a += power[gcd(i, n)];
ll b = 0;
if(n % 2 == 1){
b = n * power[(n + 1) / 2];
}else
b = n / 2 * (power[n / 2 + 1] + power[n / 2]);
cout << a / n << ' ' << (a + b) / 2 / n << endl;
}
return 0;
}