您有一个长度为N的数组A.您可以对数组A的元素执行操作(您可以多次执行该操作)。在操作中,您可以将任何元素除以大于1的最小因子。您将获得Q任务。在每个任务中,您将获得一个整数K,您必须告诉阵列A中最多可以通过最多K次操作减少到1的元素数。
输入:
第一行包含两个以空格分隔的整数,N和Q.
第二行包含N个空格分隔的整数,表示数组A的元素。
下一个Q行每个都包含一个整数,表示K的值。
输出:
对于每项任务,在新行中打印t th 任务的答案。
Example Input: Example Output:
3 3 1
8 9 12 3
3 0
10
1
Explanation:
Number of operations required are 3,2,3 respectively.
For the first task, we can reduce any one of the three elements to 1.
For second task, we can reduce all the elements of the array to 1.
For third task, we cannot reduce any elements to 1.
答案 0 :(得分:2)
抱歉我的英文。
首先,你要建立一个Eratosthenes的Sieve,但不是布尔值,而是保存分隔数字的较小素数的信息,例如:
for (int i=4; i < MAXN; i+=2) sieve[i] = 2;
for (int i=3; i < MAXN; i+=2){
if (!sieve[i]) for (int j=i*i; j <= MAXN; j+=2*i){
if (!sieve[j]) sieve[j] = i;
} }
然后,使用筛子可以轻松优化地构建一个数组B,其中包含A中每个元素所需的操作数。之后,对数组B进行排序,您可以使用二进制搜索来回答查询。