文章目录
前言
本篇文章的内容为上一次课中 gh 巨佬留下的 T8, T10 的题解。
这两道题难度较大,考察了 Polya/Burnside 定理,组合数学能力与反演能力。解法步骤可能较多,但是如果你耐下心来看,肯定还是能看懂的。
本篇文章写得非常详细,希望能够给予你帮助。
T8
Description
请求出,对于所有节点数为 n n n,边的颜色种数不超过 m m m 的无向完全图,最多有几张图满足两两不同构。
A, B 两个图同构,当且仅当将 A 图的节点经过一定的重新标号之后,A 图的顶点集和边集与 B 图一一对应。
答案对 p p p 取模。
1 ≤ n ≤ 53 , 1 ≤ m ≤ 1000 , n < p ≤ 1 0 9 1 \le n \le 53, 1 \le m \le 1000,n<p \le 10^9 1≤n≤53,1≤m≤1000,n<p≤109
Solution
算法一
根据 Burnside 引理,我们可以枚举所有关于点的置换 ( 1 , 2 , 3 , 4 … a n a 1 , a 2 , a 3 , a 4 … a n ) \begin{pmatrix} 1,2,3,4 \dots a_n \\ a_1,a_2,a_3,a_4 \dots a_n\end{pmatrix} (1,2,3,4…ana1,a2,a3,a4…an) ,并求出存在多少个图,满足将点 1 , 2 , 3 , 4 … n 1,2,3,4 \dots n 1,2,3,4…n 分别映射到 a 1 , a 2 , a 3 … a n a_1,a_2,a_3 \dots a_n a1,a2,a3…an 后图不变。显然,将这些方案数求和,再除以 n ! n! n! 即为答案。
我们将 ( a 1 , a 2 … a n ) (a_1,a_2 \dots a_n) (a1,a2…an) 给拆成许多置换的乘积,例如 ( 1 , 2 , 3 , 4 3 , 4 , 1 , 2 ) = ( 1 , 3 3 , 1 ) ⋅ ( 2 , 4 4 , 2 ) \begin{pmatrix} 1,2,3,4 \\ 3,4,1,2 \end{pmatrix}=\begin{pmatrix} 1,3 \\ 3,1 \end{pmatrix} \cdot \begin{pmatrix} 2,4 \\ 4,2 \end{pmatrix} (1,2,3,43,4,1,2)=(1,33,1)⋅(2,44,2)
令这些置换的大小分别为 b 1 , b 2 … b m b_1,b_2 \dots b_m b1,b2…bm(这里的 m m m 表示拆分后置换的数量)。
考虑边 ( u , v ) (u,v) (u,v) 必须与哪些边的颜色相同。因为 u , v u,v u,v 可能在同一置换中也可能在不同置换中,所以分类讨论如下:
两个端点在同一置换中
令 u , v u,v u,v 所在的置换为 S S S。
我们令两条边属于同一个等价类当且仅当这两条边可以通过有限次映射互相得到。例如,当置换 S = ( 1 , 2 , 3 , 4 , 5 , 6 2 , 3 , 4 , 5 , 6 , 1 ) S=\begin{pmatrix} 1,2,3,4,5,6 \\ 2,3,4,5,6,1 \end{pmatrix} S=(1,2,3,4,5,62,3,4,5,6,1) 时,下图中颜色相同的边属于同一个等价类:
图是盗的
不难发现S内部的等价类的数量为 ⌊ ∣ S ∣ 2 ⌋ \lfloor \dfrac {|S|} 2 \rfloor ⌊2∣S∣⌋ 。
下面给出简要证明:
①若
n
n
n 为偶数,那么恰有
n
2
−
1
\dfrac {n} 2 -1
2n−1 个大小为
n
n
n 的等价类与一个大小为
n
2
\dfrac n 2
2n 的等价类;
②若
n
n
n 为奇数,那么恰有
n
−
1
2
\dfrac {n-1} 2
2n−1 个大小为
n
n
n 的等价类。
因此,无论 n n n 是奇是偶,其等价类的数量恰为 ⌊ ∣ S ∣ 2 ⌋ \lfloor \dfrac {|S|} 2 \rfloor ⌊2∣S∣⌋ 。
由于有
m
m
m 个子置换,每个置换内部属于同一个等价类的边的颜色必须相同,所以这一情况的贡献为
∑
i
=
1
m
⌊
b
i
2
⌋
\sum_{i=1}^m \lfloor \frac {b_i} 2 \rfloor
i=1∑m⌊2bi⌋
两个端点在不同置换中
令边 ( u , v ) (u,v) (u,v) 的两个端点分别属于第 x x x 个与第 y y y 个置换。令这两个置换的大小分别为 b x , b y b_x,b_y bx,by 。
我们令两条边属于同一个等价类当且仅当这两条边可以通过有限次映射互相得到。
例如,当第 x x x 个置换为 ( 1 , 2 , 3 , 4 2 , 3 , 4 , 1 ) \begin{pmatrix} 1,2,3,4 \\ 2,3,4,1 \end{pmatrix} (1,2,3,42,3,4,1) ,第 y y y 个置换为 ( 5 , 6 6 , 5 ) \begin{pmatrix} 5,6 \\ 6,5 \end{pmatrix} (5,66,5) 时,第一个等价类包含了边 ( 1 , 6 ) (1,6) (1,6), ( 2 , 5 ) (2,5) (2,5), ( 3 , 6 ) (3,6) (3,6), ( 4 , 5 ) (4,5) (4,5) ,第二个等价类包含了边 ( 1 , 5 ) (1,5) (1,5), ( 2 , 6 ) (2,6) (2,6), ( 3 , 5 ) (3,5) (3,5), ( 4 , 6 ) (4,6) (4,6) 。。
由于 ( u , v ) (u,v) (u,v) 被映射 lcm ( b x , b y ) \text{lcm}(b_x,b_y) lcm(bx,by) 次后会重新变为 ( u , v ) (u,v) (u,v) ,从而不同的等价类的数量为 b x × b y lcm ( b x , b y ) = gcd ( b x , b y ) \frac {b_x \times b_y} {\text{lcm} (b_x,b_y)}=\gcd(b_x,b_y) lcm(bx,by)bx×by=gcd(bx,by)
于是这一部分对答案的贡献为
∑ i = 1 m ∑ j = i + 1 m gcd ( b i , b j ) \sum_{i=1}^m \sum_{j=i+1}^m \gcd(b_i,b_j) i=1∑mj=i+1∑mgcd(bi,bj)
综上所述,我们暴力枚举置换 a a a ,求出数组 b b b 并算出上面两个值即可。
时间复杂度 O ( n ! × n 2 ) O(n! \times n^2) O(n!×n2) 。光荣爆炸。
算法二
令 f ( b ) = ∑ i = 1 m ⌊ b i 2 ⌋ + ∑ i = 1 m ∑ j = i + 1 m gcd ( b i , b j ) f(b)=\sum_{i=1}^m \lfloor \dfrac {b_i} 2 \rfloor+\sum_{i=1}^m \sum_{j=i+1}^m \gcd(b_i,b_j) f(b)=∑i=1m⌊2bi⌋+∑i=1m∑j=i+1mgcd(bi,bj) 。
不难发现, f ( b ) f(b) f(b) 为仅关于 b b b 的函数。换言之,我们并不需要知道具体的置换 a a a,只需要知道其所有子置换的大小。同时,我们可以发现,将 b b b 按照任意顺序排列后 f ( b ) f(b) f(b) 不变。
这两个性质启发我们去枚举满足 b 1 ≤ b 2 ≤ b 3 ≤ ⋯ ⋯ ≤ b m b_1 \le b_2 \le b_3 \le \cdots \cdots \le b_m b1≤b2≤b3≤⋯⋯≤bm 的数组 b b b。
令 g ( b ) g(b) g(b) 表示满足 ⌊ \lfloor ⌊ 所有 m m m 个子置换的大小分别为 b 1 , b 2 , b 3 ⋯ ⋯ b m b_1,b_2,b_3 \cdots \cdots b_m b1,b2,b3⋯⋯bm ⌉ \rceil ⌉ 的置换 c c c 的数量。答案显然为 1 n ! ∑ b m f ( b ) × g ( b ) \frac 1 {n!}\sum_b m^{f(b)} \times g(b) n!1b∑mf(b)×g(b)
f f f 我们已经能快速求出,现在关键在于快速求出 g g g 。
首先思考整个置换的方案数。我们任意安排 1 , 2 , 3 , ⋯ , n 1,2,3,\cdots,n 1,2,3,⋯,n 分别被映射到乘了什么,有 n ! n! n! 种方案。对于属于同子置换的 b i b_i bi 个元素,它内部的每一种排列都被算了一次,于是还要除以 ∏ i = 1 m b i ! \prod_{i=1}^m b_i! ∏i=1mbi! 。
同时,第 i i i 个子置换本身有 b i ! b i \dfrac {b_i!} {b_i} bibi! 的贡献。为什么呢?考虑将置换 ( 1 , 2 , 3 ⋯ , n a 1 , a 2 , a 3 ⋯ a n ) \begin{pmatrix} 1,2,3 \cdots,n \\ a_1,a_2,a_3 \cdots a_n \end{pmatrix} (1,2,3⋯,na1,a2,a3⋯an) 看做一个形如 1 → a 1 → a a 1 → a a a 1 ⋯ 1 \to a_1 \to a_{a_1} \to a_{a_{a_1}} \cdots 1→a1→aa1→aaa1⋯ 的环排列。由于长度为 b i b_i bi 的环排列有 b i ! b i \dfrac {b_i!} {b_i} bibi! 种,所以对应的置换就有 b i ! b i \dfrac {b_i!} {b_i} bibi! 种。
最后是最容易漏的一步:当 b x = b y b_x=b_y bx=by 时,将第 x x x 个置换与第 y y y 个置换对调后对应的图依然同构。令 v v v 为 b b b 的桶 ( v i = ∑ j = 1 m [ b j = i ] v_i=\sum_{j=1}^m [b_j=i] vi=∑j=1m[bj=i]),那么当前计算的值还要除以 ∏ i = 1 n v i ! \prod_{i=1}^n v_i! ∏i=1nvi!。
综上所述:
a n s = 1 n ! ∑ b m f ( b ) × g ( b ) ans=\frac 1 {n!}\sum_b m^{f(b)} \times g(b) ans=n!1b∑mf(b)×g(b)
a n s = 1 n ! ∑ b ( n ! ∏ i = 1 m b i ! b i ∏ i = 1 m b i ! ∏ i = 1 n v i ! ) m f ( b ) ans=\frac 1 {n!}\sum_b (\dfrac {n! \prod_{i=1}^m \frac {b_i!} {b_i}} {\prod_{i=1}^m b_i! \prod_{i=1}^n v_i!}) m^{f(b)} ans=n!1b∑(∏i=1mbi!∏i=1nvi!n!∏i=1mbibi!)mf(b)
a n s = ∑ b m f ( b ) ∏ i = 1 m b i ∏ i = 1 n v i ! ans=\sum_b \dfrac {m^{f(b)}} {\prod_{i=1}^m b_i \prod_{i=1}^n v_i!} ans=b∑∏i=1mbi∏i=1nvi!mf(b)
时间复杂度证明
时间复杂度为 O ( n × P ( n ) ) O(n \times P(n)) O(n×P(n)) ,这里 P ( n ) P(n) P(n) 表示将 n n n 拆分为一个不下降序列之和的方案数。
P ( n ) P(n) P(n) 似乎很大的样子 ⋯ ⋯ \cdots \cdots ⋯⋯ 但是通过计算,你会发现
P ( 53 ) = 329931 \huge P(53)=329931 P(53)=329931
于是就可以轻松通过了。
如果你想要拿到最优解,请加上下面的几个剪枝:
①在
d
f
s
dfs
dfs 的时候实时维护当前答案;
②注意到在算
f
f
f 的时候需要用到
gcd
\gcd
gcd ,我们可以
O
(
n
2
log
n
)
O(n^2 \log n)
O(n2logn) 地预处理出每一对
1
≤
i
≤
n
,
1
≤
j
≤
n
1 \le i \le n,1 \le j \le n
1≤i≤n,1≤j≤n 的
(
i
,
j
)
(i,j)
(i,j) 的
gcd
\gcd
gcd ,需要的时候直接
O
(
1
)
O(1)
O(1) 调用;
③使用 O2/O3 优化;
④略微卡常。
Summary
核心在于 f ( b ) f(b) f(b) 的计算与 g ( b ) g(b) g(b) 的计算,而我们通过置换的性质,巧妙、快速地算出了这两个值。
本题是 Polya 定理的灵活应用题,同时也涉及到了剪枝与时间复杂度的估计,可以说是一道清新,小码量,大思维,小式子,大难度的好题。
最后放上粉兔对本题的评价:
计数好题,原来是 13 年前就出现了经典套路啊。这题在当年应该很难吧。
——小粉兔
T9
Description
给定 n , a n,a n,a ,有一个长度为 n n n 的珍珠项链,每个珍珠上有 3 3 3 个数字,每个数字不超过 a a a 。两个珍珠本质相同,当且仅当对这个珍珠上的数字重排之后可以互相得到。
求存在多少个本质不同的项链,使得任意两个相邻的珍珠不同。
两个项链不同当且仅当它们不循环同构。
Solution
套路题。
首先,我们考虑求出存在多少个不同的珍珠。令
f
(
x
,
t
)
=
∑
a
1
=
1
x
∑
a
2
=
1
x
⋯
∑
a
t
=
1
x
[
gcd
(
a
1
,
a
2
⋯
a
t
)
=
1
]
f(x,t)=\sum_{a_1=1}^x \sum_{a_2=1}^x \cdots \sum_{a_t=1}^x [\gcd(a_1,a_2 \cdots a_t)=1]
f(x,t)=a1=1∑xa2=1∑x⋯at=1∑x[gcd(a1,a2⋯at)=1]
则根据 Burnside 引理,不难得到
v
=
1
3
!
∑
i
=
0
3
[
3
i
]
f
(
x
,
i
)
v=\frac 1 {3!}\sum_{i=0}^3 \begin{bmatrix} 3 \\ i\end{bmatrix} f(x,i)
v=3!1i=0∑3[3i]f(x,i)
这里的 v v v 表示不同珍珠的数量, [ 3 i ] \begin{bmatrix} 3 \\ i\end{bmatrix} [3i] 是第一类斯特林数。
从而
v
=
f
(
x
,
3
)
+
3
f
(
x
,
2
)
+
2
f
(
x
,
1
)
6
v=\frac {f(x,3)+3f(x,2)+2f(x,1)} 6
v=6f(x,3)+3f(x,2)+2f(x,1)
我们通过莫反可以轻松求出 f ( x , 3 ) , f ( x , 2 ) f(x,3),f(x,2) f(x,3),f(x,2) 。注意 f ( x , 1 ) = 1 f(x,1)=1 f(x,1)=1 。
求出了不同珍珠的数量之后,我们再次使用 Burnside 引理:
∑ i = 1 n g ( gcd ( i , n ) ) \sum_{i=1}^n g(\gcd(i,n)) i=1∑ng(gcd(i,n))
= ∑ k ∣ n g ( k ) φ ( n k ) =\sum_{k|n} g(k) \varphi(\frac n k) =k∣n∑g(k)φ(kn)
g ( k ) g(k) g(k) 表示循环节长度为 k k k 的,满足题目要求的珍珠的数量。
考虑到 g ( k ) g(k) g(k) 实际上是一个长度为 k k k 的环,每个位置都有 v v v 种可以染的颜色,且相邻的位置的颜色不同。
这是一个十分经典的环染色问题,直接套公式即可。令 A ( n , m ) A(n,m) A(n,m) 表示长度为 n n n 且用 m m m 种颜色的方案数:
A ( n , m ) = ( m − 1 ) n + ( m − 1 ) ( − 1 ) n A(n,m)=(m-1)^n + (m-1)(-1)^n A(n,m)=(m−1)n+(m−1)(−1)n
我们找到 n n n 质因数分解,然后通过一遍 d f s dfs dfs 求出每个因数的 φ \varphi φ ,从而可以高效地求出答案。
注意,本题的 n > p n>p n>p( p p p 为模数),所以我们需要用 n n n 对 p × p p \times p p×p 取模;最后再去模 p p p 。
T10
Description
将一个长度为 n n n 的环染成黑白两色,要求:
①恰有
m
m
m 个黑格与
n
−
m
n-m
n−m 个白格;
②环上不存在一段连续的,长度超过
k
k
k 的黑色段;
请你求出存在多少个不同的染色方案。
注意,两个环不同,当且仅当这两个环不循环同构。
1 ≤ n , k ≤ 1 0 5 1 \le n,k \le 10^5 1≤n,k≤105
Solution
令群 G G G 包含了所有由单位元 ( 1 , 2 , 3 … n 1 , 2 , 3 … n ) \begin {pmatrix} 1,2,3 \dots n \\ 1,2,3 \dots n \end{pmatrix} (1,2,3…n1,2,3…n) 循环平移得到的置换。
也就是说,群 G G G 中除了单位元,还有 ( 1 , 2 , 3 … n 2 , 3 , 4 … 1 ) \begin {pmatrix} 1,2,3 \dots n \\ 2,3,4 \dots 1 \end{pmatrix} (1,2,3…n2,3,4…1)
( 1 , 2 , 3 … n 3 , 4 , 5 … 2 ) \begin {pmatrix} 1,2,3 \dots n \\ 3,4,5 \dots 2 \end{pmatrix} (1,2,3…n3,4,5…2)
⋯ ⋯ \cdots \cdots ⋯⋯
令
F
(
g
)
F(g)
F(g) 表示,存在多少种合法的染色方案使得它在
g
g
g 的作用下保持不变。根据 Burnside 引理,有
a
n
s
=
1
∣
G
∣
∑
g
∈
G
F
(
g
)
ans=\frac {1} {|G|} \sum_{g \in G} F(g)
ans=∣G∣1g∈G∑F(g)
令 f ( x ) f(x) f(x) 表示,存在多少种染色方案,使得其循环节长度为 x x x 且满足题目中的两个要求。不难得到:
a n s = 1 n ∑ i = 1 n f ( gcd ( n , i ) ) ans \ = \ \frac 1 n \sum_{i=1}^n f(\gcd(n,i)) ans = n1i=1∑nf(gcd(n,i))
前面的 1 n \frac 1 n n1 非常好求,我们暂且忽略它。关键在于后面的那个 ∑ \sum ∑ 的计算。我们套路地枚举 gcd ( n , i ) = x \gcd(n,i)=x gcd(n,i)=x:
∑ x ∣ n f ( x ) ∑ i = 1 n [ gcd ( n , i ) = x ] \sum_{x|n} f(x) \sum_{i=1}^n [\gcd(n,i)=x] x∣n∑f(x)i=1∑n[gcd(n,i)=x]
= ∑ x ∣ n f ( x ) ∑ i = 1 n x [ gcd ( n x , i ) = 1 ] =\sum_{x|n} f(x) \sum_{i=1}^{\frac n x} [\gcd(\frac n x,i)=1] =x∣n∑f(x)i=1∑xn[gcd(xn,i)=1]
= ∑ x ∣ n f ( x ) φ ( n x ) =\sum_{x|n} f(x) \varphi(\frac n x) =x∣n∑f(x)φ(xn)
φ \varphi φ 函数可以通过线性筛预处理出来,于是现在关键在于计算 f ( x ) f(x) f(x) 。
由于确定了第一个循环节就足以确定整个串,所以我们仅考虑第一个循环节。第一个循环节的长度显然为 x x x 。
于是
f
(
x
)
f(x)
f(x) 的实际意义为,满足下面两个限制的环状染色方案数:
①恰有
m
x
n
\frac {mx} {n}
nmx 个黑色的格子,剩下的
x
−
m
x
n
x-\frac {mx} {n}
x−nmx 个格子为白;
②在这个环上不存在一段连续的,长度超过
k
k
k 的黑色段。
注意,之所以这里的第一个循环节必须被认作一个环,是因为第一个循环节与第二个循环节的交界处,第 x x x 个格子与第 1 1 1 个格子相邻。
在思考如何处理 f ( x ) f(x) f(x) 之前,我们先考虑一个较为简单的问题。
令 A ( x , t , k ) A(x,t,k) A(x,t,k) 表示,存在多少种给长度为 x x x 的链黑白染色的方案,使得其恰好有 t t t 个白色的格子,不存在一段连续的长度超过 k k k 的黑色段且首尾两个格子为白。
考虑如何计算 A ( x , t , k ) A(x,t,k) A(x,t,k) 。本质上,我们需要在 t t t 个白格的 t − 1 t-1 t−1 个空隙中插入黑色的格子,且同一个空隙中插入的黑格数量不能超过 k k k 。于是现在问题转化为:求有多少种将 x − t x-t x−t 拆分为 t − 1 t-1 t−1 个自然数之和的方案,要求每个自然数不超过 k k k 。
考虑容斥。我们钦定 c n t cnt cnt 个超过 k k k 的数,并枚举这个 c n t cnt cnt 。我们先在 t − 1 t-1 t−1 个位置中选择这样的 c n t cnt cnt 个,然后在这些位置上各放上 k + 1 k+1 k+1 个 1 1 1 ;此时我们要将剩下的 x − t − ( k + 1 ) × c n t x-t-(k+1) \times cnt x−t−(k+1)×cnt 拆分为 t − 1 t-1 t−1 个自然数之和,直接插板法即可。
形式化地说,
A ( x , t , k ) = ∑ c n t = 0 ⌊ x k ⌋ ( − 1 ) t ( t − 1 c n t ) P ( x − t − c n t ( k + 1 ) , t − 1 ) A(x,t,k)=\sum_{cnt=0}^{\lfloor \frac x k \rfloor} (-1)^t{t-1 \choose cnt} P(x-t-cnt(k+1), \ t-1) A(x,t,k)=cnt=0∑⌊kx⌋(−1)t(cntt−1)P(x−t−cnt(k+1), t−1)
于是我们完成了 A ( x , t , k ) A(x,t,k) A(x,t,k) 的计算,单次时间复杂度为 O ( x k ) O(\frac x k) O(kx) 。
接下来考虑计算 f ( x ) f(x) f(x) 。注意, f f f 与 A A A 唯一的区别在于,这是一个环而非一条链。于是,我们套路地断环为链(在首尾两处断开),枚举开头与结尾的的总黑格数量。令这个值为 w w w ,那么答案需要累加 A ( x − w , x − m x n , k ) × ( w + 1 ) A(x-w,x-\frac {mx} n,k) \times (w+1) A(x−w,x−nmx,k)×(w+1) 。这里的 A ( x − w , x − m x n , k ) A(x-w,x-\frac {mx} {n},k) A(x−w,x−nmx,k) 表示将剩下的 x − w x-w x−w 个格子染色的方案数, w + 1 w+1 w+1 表示将 w w w 拆分为两个自然数之和的方案数。注意,对于一种形如 w = u + v w=u+v w=u+v 的拆分方案,其实际意义为,在链的开头染 u u u 个黑格并在链的尾端染 v v v 个黑格。
形式化地说,
f ( x ) = ∑ w = 0 x A ( x − w , x − m x n , k ) × ( w + 1 ) f(x)=\sum_{w=0}^x A(x-w,x-\frac {mx} {n},k) \times (w+1) f(x)=w=0∑xA(x−w,x−nmx,k)×(w+1)
由于单次计算 A A A 的代价为 O ( n k ) O(\frac n k) O(kn) ,所以单次计算 f f f 的代价为 O ( k × x k ) = O ( x ) O(k \times \frac x k)=O(x) O(k×kx)=O(x) 。
由于答案的式子为
a n s = ∑ i ∣ n f ( i ) φ ( n i ) ans=\sum_{i|n} f(i) \varphi(\frac n i) ans=i∣n∑f(i)φ(in)
所以时间复杂度为 O ( ∑ i ∣ n i ) O(\sum_{i|n} i) O(∑i∣ni) 。
由于
n
n
n 的约数个数为
n
\sqrt n
n 级别,所以约数之和是
n
n
n \sqrt n
nn 级别,于是总时间复杂度为
O
(
n
n
)
O(n \sqrt n)
O(nn)
本题被完美解决。
Summary
理一遍思路。
首先,看到循环同构,无脑莽上个 Burnside 引理。
然后,发现不动点是一个循环串,于是我们只考虑第一个循环串。
再然后,我们断环为链,然后用容斥 + 插板法乱搞。
紧接着,我们算出了时间复杂度,发现能过。
最后,你切掉了这题。
可以说这是一道不折不扣的套路题,唯一的难点在于容斥。笔者当时并没有想到容斥,然后就在那里死磕了半天也没想出来,最后看了题解才恍然大悟。
值得一提的是,本题似乎还有时间复杂度更优的多项式做法,但是难度过大,常数也很大,实际上并没有上述做法跑得快。