将问题转化:一个区间乘积的二进制末尾有 ≥k 个 0,等价于该区间内所有元素的 2 的因子个数之和 ≥ k。
记 v2(x) 为 x 被 2 整除的次数(即二进制尾随零个数),则区间 [l,r] 满足条件 ⇔ sum(v2(a[l..r])) ≥ k。
算法:
b[i] = v2(a[i])(非负整数);b[i] ≥ 0,可用 滑动窗口/双指针:右指针不断右移累加窗口和 s;当 s ≥ k 时,尝试移动左指针缩小窗口并更新答案的最小长度。若整个数组 b 的总和都 < k,则不存在满足条件的子数组,输出 -1(若题目平台有其他约定,可按平台改动)。
K0序列是指,序列中元素的乘积转换为2进制后末尾至少有 k 个0。
给定一个长度为 n 的序列 a 和 k 值,求其中为K0序列的连续子序列的最小长度。
输入第一行两个正整数 n,k 。(3≤n≤105,1≤k≤105)
输入第二行 n 个正整数,第 i个为 ai 。(1≤ai≤109)
输出一个正整数 ,表示连续子序列的二进制不小于 k 的长度。
样例输入
7 3
1 2 3 4 5 6 7
样例输出
3