图论不行,网络流不行,就只能往线性代数方面走。
这里有个十分巧妙的做法,就是用矩阵行列式和多项式循环卷积来刻画两个条件: 这个时候,如果原矩阵不存在完美匹配,那么矩阵的行列式一定为0。否则由于分配了随机权值,每个排列的值不容易抵消掉。如果存在一个排列的合适程度和
m
o
d
k
=
i
bmod k=i
modk=i,那么行列式的
i
i
i 次项系数很大概率不为 0。所以我们得到一个较暴力的做法:求出
A
A
A 的行列式,根据常数项是否为零判断答案。 暴力卷积显然是
O
(
n
5
)
O(n^5)
O(n5) 的,我们可以考虑先把多项式转换成点值,求出行列式过后再插值回去。由于要做到循环卷积,所以当然想到求单位根的点值。但是直接复数单位根会有精度问题,我们可以考虑找一个大质数
P
P
P 满足
k
∣
φ
(
P
)
k|varphi(P)
k∣φ(P),然后用原根的若干次方代替单位根。这个大质数暴力枚举找一下即可,很快就找到了。 然后就得到
O
(
n
4
)
O(n^4)
O(n4) 的算法。
构造矩阵
A
A
A:
a
i
j
=
[
f
i
j
≥
0
]
c
i
j
x
f
i
j
a_{ij}=[f_{ij}ge 0]c_{ij} x^{f_{ij}}
aij=[fij≥0]cijxfij
x
x
x 是未知数,
c
i
j
c_{ij}
cij 是每个元素随即分配的一个权值。此时矩阵的每个元素是一个单项式,以循环卷积来做高消的话,求出来的行列式就是一个度数
<
k
#include



