1.基本概念:
简单来说,置换就是把n个元素做一个全排列。比如1,2,3,4分别变成3,1,2,4,或者分别变成4,3,2,1.一般地,1变a1,2变a2,...的置换记为:
\[
\left(
\begin{matrix}
1 & 2\cdots & n\a_1 & a_2\cdots & a_n\\end{matrix}
\right)
\]
置换实际上就是一一映射,
? (1)可以用一个数组f={a1,a2,...,an}来表示1~n的一个置换,其中f[i]表示元素i所映射到的(f[0]未使用)。
? (2)这个f也可以看作是定义域和值域都为{1,2,3,...,n}的函数,其中f(1)=a1,f(2)=a2,f(3)=a3,...,f(n)=an。由于不同元素映射到不同的数,这个函数是可逆的。
? 置换之间可以定义乘法,对应于函数复合。
比如置换f={1,3,2}和g={2,1,3},乘积fg={2,3,1},因为各个元素的变化为1->1->2,2->3->3,3->2->1。
在数学上函数复合满足结合律,故置换乘法也满足结合律。注意:置换乘法不满足交换律。
? 为了处理方便,常把置换分解成循环的乘积,比如:
\[
\left(
\begin{matrix}
1&2&3&4&5\3&5&1&4&2\\end{matrix}
\right)=(1\quad3)(2\quad5)(4)
\]
为什么任意置换都能这样分解呢?把每个元素看成是一个结点,如果a变成b,连一条有向边a->b,则每个元素恰好有一个前驱结点和后继结点(因为它一定只映射了一个数,也一定只有一个数映射为它,否则置换后的数就不再是1~n中的每一个数了,会有数的缺失),这样的图只能是若干个有向圈,其中每一个圈对应一个循环。
虽然在一般情况下,置换乘法不满足交换律,但对于不相交的循环来说,按照任意顺序相乘都是等价的。
我们称循环分解中中循环的个数为该置换的循环节。比如(1 3)(2 5)(4)的循环节为3。
2.等价类计数问题
? 经典问题:在2*2的方格中涂黑白两色,有几种方法?
? 答案:16种。
? 但如果定义一种旋转操作,规定逆时针旋转90度,180度或者270度后相同的方案算作一种,那么答案就变成了6种了。
这样的问题称为等价类计数问题。
题目中会定义一种等价关系,满足等价关系的元素被看成同一类,只统计一次。
等价关系需要满足自反性(每个元素和它自身等价)、对称性(如果A和B等价,则B和A等价)和传递性(如果A和B等价,B和C等价,则A和C等价)。
为了统计等价类的个数,首先需要用一个置换集合F来描述等价关系。如果一个置换把其中一个方案映射到另一个方案,就说二者是等价的。注意:F中任意两个置换的乘积也应当在F中,否则F无法构成置换群。如:F={逆时针旋转0度,逆时针旋转90度,逆时针旋转270度}的定义是不合法的,因为两个逆时针旋转90度,即为逆时针旋转180度,而F中却并没有定义逆时针旋转180度。
Burnside定理:对于一个置换f,若一个着色方案s经过置换后不变,称s为f的不动点。将f的不动点数目记为C(f),则可以证明等价类数目为所有C(f)的平均值。
如何求不动点C(f)的数目呢?一般地,如果置换f分解成m(f)个循环的乘积,那么每个循环内所有格子的颜色必须相同,假设涂k种颜色,则有C(f)=k^(m(f))。带入Burnside引理的表达式之后得到Polya定理。
Polya定理:等价类的个数等于所有置换f的k^(m(f))的平均数。
例题:项链和手镯(Arif in Dhaka(First Love Part 2))
题意:用n颗宝石串成项链和手镯, 每颗宝石的颜色可以t种颜色中的一种,当A类项链经过旋转得B类项链时,A和B属于一类项链, 而手镯不仅可以旋转还可以翻转,当A类手镯经过翻转得到B类手镯时A和B属于一类手镯,问这n颗宝石,t种颜色,可以串成多少种项链和手镯?
分析:旋转:如果逆时针旋转i颗珠子的间距,则珠子0,i,2i,...构成一个循环。设该循环共有k个元素,则(ik)%n=0(回到最初的0),所以i k=n * y,等式两边的值应为lcm(n,i),故i*k=lcm(n,i)=
n * i/gcd(n,i),故可求得k=n/gcd(n,i)。根据对称性,1,2i+1,...也构成循环,每个循环的长度都相同,共有n个数,一个循环的长度为n/gcd(n,i),故循环的个数为gcd(n,i)。这些置换的不动点的个数为:
\[
a=\sum_{i=0}^{n-1}t^{gcd(i,n)}
\]
翻转:当n为奇数时,对称轴有n条(分别过每一个珠子做一条对称轴),每条对称轴形成了(n-1)/2个长度为2的循环(关于对称轴对称的两个点构成一个循环,再减去在对称轴上的那个点)和1个长度为1的循环,即(n+1)/2个循环。这些置换的不动点的总数为
\[
b=nt^{\frac{n+1}{2}}
\]
当n为偶数时,有两种对称轴,穿过珠子的有n/2条,各形成n/2-1个长度为2的循环和2个长度为1的循环;不穿过珠子的对称轴有n/2条,各形成n/2个长度为2的循环。这些置换的不动点的总数为
\[
b=\frac{n}{2}(t^{\frac{n}{2}+1}+t^{\frac{n}{2}})
\]
根据Polya定理,项链等价类总数为a/n,手镯等价类的总数为(a+b)/2n。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=55;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int n,t;
while(scanf("%d%d",&n,&t)==2&&n)
{
LL pow[maxn];
pow[0]=1;
for(int i=1;i<=n;++i) pow[i]=pow[i-1]*t;
LL a=0;
for(int i=0;i<n;++i) a+=pow[gcd(n,i)];
LL b=0;
if(n%2==1) b=n*pow[(n+1)/2];
else b=n/2*(pow[n/2+1]+pow[n/2]);
printf("%lld %lld\n",a/b,(a+b)/2/n);
}
return 0;
}
原文地址:https://www.cnblogs.com/iwillenter-top1/p/11622017.html