问题转化:要求最小化子序列中最大元素的值,可以对这个最大值 M 进行二分查找。
判定问题变为:在所有 ai≤M 的元素中,能否按原顺序选出一个长度为 k 的子序列,且相邻两项的最大公约数大于 1。
特殊情况:若 k=1,则无需考虑相邻关系,答案为整个序列中的最小值,可直接在二分时特判。
判定方法:
给定一个长度为 n 的整数序列 a1,a2,…,an。你需要从原序列中按顺序选出恰好 k 个元素,构成一个子序列。如果在这个子序列中,每一对相邻元素的最大公约数(gcd)都大于 1,则称该子序列是相容的。
请你找出所有相容子序列中,最大元素的最小可能值。如果不存在任何相容子序列,则输出 −1。
序列长度 n 满足 2≤n≤2×105,需选取的元素个数 k 满足 1≤k≤n。序列中的每个整数 ai 均在 1 到 109 之间。
第一行包含两个整数 n 和 k,分别表示序列长度和需要选出的子序列长度。 第二行包含 n 个整数,依次为 a1,a2,…,an。
输出一个整数,表示所有合法相容子序列中最大元素的最小可能值;如果不存在,输出 −1。
输入
5 3
2 4 6 5 10
输出
6
说明
需要选出恰好 3 个元素。考察子序列 2, 4, 6:
gcd(2,4)=2>1,gcd(4,6)=2>1,满足相容条件,最大值为 6。
其他合法子序列如 2, 6, 10 的最大值为 10,大于 6。因此最小可能的最大值是 6。
输入
4 2
2 3 5 7
输出
-1
说明
需要选出 2 个元素。序列中任意两个不同元素的 gcd 均为 1,不存在满足“每一对相邻元素 gcd>1”的子序列,因此无解,输出 -1。
输入
4 2
1 2 3 4
输出
4
说明
需要选出 2 个元素。注意 1 与任何整数的 gcd 都是 1,不能出现在长度 ≥2 的相容子序列中。
剩余可选元素为 2, 3, 4:
2 与 3 的 gcd=1,不合法;3 与 4 的 gcd=1,不合法;2 与 4 的 gcd(2,4)=2>1,合法,最大值为 4。
因此答案为 4。输入
3 1
9 5 7
输出
5
说明
当 k = 1 时,只需选出 1 个元素,没有相邻约束。因此直接选择序列中最小的元素即可,最小值为 5。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.