Description
题目链接:Codeforces 498C
你有一个长度为 $n$ 的正整数序列 $a_1,a_2,\dots,a_n$ 和 $m$ 对整数 $(i_1,j_1),(i_2,j_2),\dots,(i_m,j_m)$。每一对整数 $(i_k,j_k)$ 都满足 $i_k+j_k$ 的值是奇数,且 $1\le i_k<j_k\le n$。
每一次操作你可以进行一系列行为:
- 在 $m$ 个数对中选择一个 $(i_k,j_k)$ 和一个整数 $v$ 满足 $v>1$,并且 $v$ 整除 $a_{i_k}$ 和 $a_{j_k}$。
- 将 $a_{i_k}$ 和 $a_{j_k}$ 都除以 $v$。
请计算出能够进行的最大操作次数。注意,每一对数可能多次使用。
数据范围:$2\le n\le 100$,$1\le m\le 100$,$1\le a_i\le 10^9$
Solution
首先注意到一个重要的性质:$i_k+j_k$ 为奇数。换言之,我们可以把原序列按照下标奇偶性分成两部分,下标为 $i_k$ 和 $j_k$ 的两个数一定不是同一个部分的。也就是说,如果我们在 $i_k$ 和 $j_k$ 之间连边,那么这是一张二分图。
我们建立出这张二分图,新建一个源点和汇点,每个点向源点或汇点连一条容量为 $\vert S_{a_i}\vert$ 的边(其中 $S_{i}$ 为 $i$ 的质因子可重集合,如 $12$ 的质因子集合为 $\{2,2,3\}$ ),$a_{i_k}$ 和 $a_{j_k}$ 之间的边的容量为 $\vert S_{a_{i_k}}\cap S_{a_{j_k}}\vert$(质因子集合交集大小)。
看起来直接跑最大流就行了?其实很容易找到反例。因为同一个数的质因子不是独立的,一旦被除去之后就不能被别的数字配对。那么我们可以想到拆点。
- 对于数字 $x$,我们把他拆成质因子个数个点,每个质因子向源点或汇点连一条容量为其指数的边。
- 对于两个数字 $x,y$,我们定义代表的质因子相同的点性质相同。我们把 $x,y$ 性质相同的点连边,容量为这个质因子在 $x$ 和 $y$ 中指数的较小值。
- 直接跑最大流即可。
时间复杂度:$O(m\sqrt n)$,前面应该有一个较大常数,因为点最多有 $9n$ 个,边最多有 $9m$ 条。
Code
1 |
|