我们给出了一个大小 N 的数组,我们必须为所有的 Ai AND(&) Aj 计算总和对(i,j)其中 i< j 。数组的大小可以大到 10 ^ 5 。那么什么是最好的计算方法。比 O(n ^ 2)更好。
答案 0 :(得分:4)
我们可以独立解决每个位的问题。
对于固定位b
,让我们调用将此位设置为一个f(b)
的元素数。
答案是sum for all b f(b) * (f(b) - 1) / 2 * 2 ^ b
。
为什么这是正确的?我们假设b
是固定的。当且仅当这两个数字都将此位设置为1时,这两个数字的位设置为1。如果具有此位设置的元素数为f(b)
,则确实存在f(b) * (f(b) - 1) / 2
对,以便两个元素都设置此位。现在我们可以找到所有b
的总和。