给出了一个包含N个正整数的数组A (1 <= Ai <= 10^9)
设F(i,j,k) =( Ai = Aj )& Ak
表示按位或-表示按位和
其任务是确定所有三重子(A,B,C)上F(A,B,C)的位异或,从而使1<= A,B,C <=N
例如:
如果N=2和A=1,4
三胞胎将是:
H 19
F(2,1,1)=1H 210H 111
F(2,1,2)=4H 212H 113
F(2,2,1)=0H 214H 115F(2,2,2)=4
位XOR of all = 1^0^1^4^1^4^0^4 =5
答案是5.
还有一个例子:
如果A=14,9,19,18,17,11,12 answer=16
如何解决这一问题,或如何处理这些问题?
用javascript编写代码是有帮助的,但也欢迎使用其他语言。
发布于 2022-02-02 13:56:06
这类问题可以通过单独考虑每一位来解决。
对于每个位,让n0表示将该位设置为0的数组元素的数量,而n1是将该位设置为1的元素数。
然后很容易确定答案中是否设置了该位:
使位在n1*n1 + n1*n0*2
i,j
是在F(i,j,k)中设置该位的i,j,k
数,然后是n1*(n1*n1 + n1*n0*2)
此时,我们可以很容易地通过计算每个位的1s和0来解决这个问题,但请注意,当n1*(n1*n1 + n1*n0*2)
是奇数时,n1
计算为奇数,即当该位在数组中出现奇数时。如果在数组中设置了奇数次数,则获得每一位设置的数字.
只是异或所有数组元素在一起,。
发布于 2022-02-02 15:39:48
马特的第一个解决方案是很好的。下面是另一个使用简单数学技巧的解决方案。
在下面的文章中,我将使用XOR的和表示法和&
的乘积表示法。
问题是如何计算F = sum F(i, j, k) = sum_{i, j, k} (A[i]|A[j]).A[k]
。
利用乘法(&
)在加法(xor)上的分布性质,我们得到:
F = sum_k A[k] . sum_{i, j} (A[i] | A[j])
我们注意到
A[i] | A[j] = A[i] + A[j] + A[i].A[j]
然后
sum_{i, j} (A[i] | A[j]) = sum_{i, j} (A[i] + A[j] + A[i].A[j])
作为A + A = 0
,很明显,sum_{i, j} (A[i] + A[j] = 0
此外,if (i != j), A[i].A[j] + A[j].A[i] = 0
.因此,
sum_{i, j} A[i].A[j] = sum_i A[i].A[i] = sum_i A[i]
我们在这里用的是A & A = A
。
最后,
F = sum_k A[k] . sum_k A[k] = sum_k A[k]
解决方案是获取数组中所有元素的XOR。
https://stackoverflow.com/questions/70956544
复制相似问题