先拓展一个之前讲过的模型的性质
对于一个编号在 [ 0 , n ) [0,n) [0,n)的环(顺时针编号),从编号为 x x x的点开始顺时针跳,每次跳 k k k步,那么最终经过的点一共有 n d \frac{n}{d} dn个(其中 d = gcd ( n , k ) d=\gcd(n,k) d=gcd(n,k)),如果我们将这 n d \frac{n}{d} dn个点按照编号顺序排成一个圆(不是按经过的顺序),那么相邻两个点之间的距离为 d d d
证明:显然将这 n d \frac{n}{d} dn个点按照编号顺序排成一个圆后,这个圆的总长度为 n n n(相邻两点之间的距离为两点编号差的绝对值)。考虑每个点的编号的形式,为 x + t 1 k − t 2 n x+t_1k-t_2n x+t1k−t2n,因为是从 x x x每次跳 k k k步,当跳过 n n n时就要减去 n n n,所以编号的形式就是 k , n k,n k,n的线性组合。故编号可以写作 x + t d x+td x+td,也就是说相邻两个点的距离是 d d d的倍数,至少为 d d d;而总长度为 n n n,当且仅当任意相邻两个点之间的距离为 d d d才为 n n n(否则的话会更大),证毕
有了这个性质,我们就可以知道,原图一共被分成了 d d d个环,每个环的起点为 x , x + 1 , x + 2 , . . . , x + d − 1 x,x+1,x+2,...,x+d-1 x,x+1,x+2,...,x+d−1
现在我们考虑Burnside引理,假设我们现在已经获得了 S S S(也就是满足题意的所有涂色方案),置换群 G G G即顺时针旋转 0 , 1 , 2 , . . . , n − 1 0,1,2,...,n-1 0,1,2,...,n−1步,我们现在要求的就是 ∣ S / G ∣ |S/G| ∣S/G∣,只需要求 ∣ S g ∣ |S^g| ∣Sg∣
现在我们考虑对于一个固定的 g g g(也就是每次跳的步数 k k k已经知道了),那么根据上面的结论,我们只用考虑 0 , 1 , 2 , . . . , d − 1 0,1,2,...,d-1 0,1,2,...,d−1这 d d d个点构成的环满足题意的涂色方案一共有多少种就好了
为什么这里不能用Polya定理:Polya定理的内容就是 ∣ B c ( g ) ∣ = ∣ S g ∣ |B^{c(g)}|=|S^g| ∣Bc(g)∣=∣Sg∣,可以想一下这个为什么成立,主要原因还是因为各个循环置换之间互不影响,所以可以任意涂色;而这里显然是会互相影响的,所以只能用Burnside引理
计算 d d d个点构成的环满足题意的涂色方案一共有多少种:很显然的环形DP,但是这里时间复杂度卡的比较紧,如果采用容斥原理(即按照线形计算,最后强制第一个点和最后一个点涂相同颜色)的话会超时(因为你要枚举第一个点涂的颜色),此时有一个优化:不采用容斥原理,而是采用正面计算,将 f f f从一维变成二维, ∀ i ∈ [ 0 , m ) , f [ i ] [ i ] = 1 \forall i∈[0,m),f[i][i]=1 ∀i∈[0,m),f[i][i]=1,这就是说第 i i i个行向量表示第一个点只能涂第 i i i种颜色,最后得到的数组经过的时间为 d + 1 d+1 d+1(注意不是 d d d,因为我们要求最后一个点和第一个点涂的颜色相同,这里相当于断环成链了),然后加上 f f f的对角线就好了
计算完 f f f后,我们还不能枚举 g g g,因为 n n n太大了,此时肯定只能枚举 d d d,最后不难知道要计算 ϕ ( n d ) \phi(\frac{n}{d}) ϕ(dn),这种计算约数的欧拉函数的技巧见这篇总结