#贪心
首先,看到 $1\le a_i\le 10^9$,我们暴力出奇迹的念头就已经消失了。但是我们能够发现,让乘积为 $2^n$ 的倍数就等同于所有数当中 $2$ 的因子的数量需要大于等于 $n$,而一个数 $2$ 的因子的数量很容易计算,因此我们就能很轻易地判断不执行任何操作能否满足条件。
然后就是贪心地去操作了。要想让在尽可能少的操作数量下 $2$ 的因子的数量尽可能的多,那么乘上的 $i$ 的 $2$ 的因子数量也要尽可能的多,因此我们只需要预处理出 $1\sim n$ 所有数的因子数量,然后从大到小排一个序,最后再贪心地选择即可。
```kotlin
import java.util.*
val cin = Scanner(System.`in`)
fun main() {
for (t in 1..cin.nextInt()) { // t 组数据
val n = cin.nextInt() // 元素数量
var cnt = 0 // 记录因子数量
var ans = 0 // 记录答案
val a = IntArray(n + 1) // 1—n 的因子数
for (i in 1..n) {
var x = cin.nextInt()
while (x % 2 == 0) { // 如果还有 2 的因子
cnt++ // 记录数量
x /= 2 // 去掉
}
}
for (i in 1..n) { // 预处理 1—n 的因子数
var x = i
while (x % 2 == 0) { // 如果还有 2 的因子
a[i - 1]++ // 记录数量
x /= 2 // 去掉
}
}
a.sortDescending() // 从大到小排序
for (i in 0..<n) { // 遍历前 n 个元素
if (cnt >= n) { // 已经满足要求
break // 跳出循环
}
cnt += a[i] // 计数器累加
ans++ // 记录答案
}
println(if (cnt >= n) ans else -1)
}
}
```