【发布时间】:2015-02-23 03:14:42
【问题描述】:
给定一个由n 正整数组成的数组a[1], a[2], ..., a[n] 和m 好的整数对(i 1, j1), (i2, j2), ..., (im, jm) 其中 1 ≤ ik k ≤ n ,
n
编辑:每个好的对 (ik, jk) 满足以下条件:ik + jk 是奇数且 1 ≤ ik
在一个操作中,您可以执行一系列操作: 取其中一对 (ik, jk) 和一些整数 v (v > 1) ,这将两个数字 a[ik] 和 a[jk] 和 divide v 两个数字。
确定您可以在给定数组上按顺序执行的最大个操作数。请注意,一对可能在所述操作中多次使用。
我的方法:
我首先对数组的每个数字进行质因数分解。
给定一对好对 (ik,jk),我们可以将两个数 A[ik] 和 A[jk] 除以它们的共同素数幂即如果A[ik]=2^5 * 3^4 和A[jk]=2^3 * 3^7 那么我们可以将它们都除以 2 共 3 次 并除以 3 4 次。操作的数量增加了最小的公素数,即 7。
然后可以将操作总数视为所有给定好的对的所有公共素数的总和。
但是,对于以下 测试用例,我的代码失败:
N=10
M=9
A[]=67108864 8 2 131072 268435456 256 16384 128 8 128
Good Pairs :
4 9
5 10
6 9
9 10
1 4
3 8
8 9
1 2
4 5
数组的每个元素都是 2 的不同幂。
根据2的幂,数组可以写成:
B[]= 26 3 1 17 28 8 14 7 3 7 //A[i] = 2^B[i]
选择每个 好对 并减去 2 的共同幂,我对每个好对的答案进展为:
26 3 1 14 28 8 14 7 0 7 ans 3
26 3 1 14 21 8 14 7 0 0 ans 10
26 3 1 14 21 8 14 7 0 0 ans 10
26 3 1 14 21 8 14 7 0 0 ans 10
12 3 1 0 21 8 14 7 0 0 ans 24
12 3 0 0 21 8 14 6 0 0 ans 25
12 3 0 0 21 8 14 6 0 0 ans 25
9 0 0 0 21 8 14 6 0 0 ans 28
9 0 0 0 21 8 14 6 0 0 ans 28
处理好每一对,我的代码给出的答案是 28。
但是正确答案是 31。我需要帮助来理解输出是如何变成 31 的以及解决这个问题的方法。
PS:问题是codeforces Div2 Round 284的问题E。
【问题讨论】:
-
我认为操作顺序很重要。这是一个示例,a = [2, 4, 4, 2],而好的对 = [(1, 2), (3, 4), (2, 3)]。如果您按给定顺序应用对,您将获得 3 次操作。但是,如果您先申请 (2, 3),您将只能进行 2 次操作。
标签: arrays algorithm prime-factoring number-theory