首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >位数组操作

位数组操作
EN

Stack Overflow用户
提问于 2022-02-02 13:31:57
回答 2查看 428关注 0票数 4

给出了一个包含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

三胞胎将是:

  • F(1,1,1) = 1
  • F(1,1,2) = 0
  • F(1,2,1) = 1
  • F(1,2,2) =4
  • F(1,2,2)=4

H 19F(2,1,1)=1H 210H 111F(2,1,2)=4H 212H 113F(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编写代码是有帮助的,但也欢迎使用其他语言。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-02 13:56:06

这类问题可以通过单独考虑每一位来解决。

对于每个位,让n0表示将该位设置为0的数组元素的数量,而n1是将该位设置为1的元素数。

然后很容易确定答案中是否设置了该位:

使位在n1*n1 + n1*n0*2

  • The中被设置的对数i,j是在F(i,j,k)中设置该位的i,j,k数,然后是n1*(n1*n1 + n1*n0*2)

  • Since,所有F的都是XORed,如果它是在奇数三叉集中设置的,则结果会有位集,也就是说,如果上面的表达式计算为奇数。

此时,我们可以很容易地通过计算每个位的1s和0来解决这个问题,但请注意,当n1*(n1*n1 + n1*n0*2)是奇数时,n1计算为奇数,即当该位在数组中出现奇数时。如果在数组中设置了奇数次数,则获得每一位设置的数字.

只是异或所有数组元素在一起,

票数 6
EN

Stack Overflow用户

发布于 2022-02-02 15:39:48

马特的第一个解决方案是很好的。下面是另一个使用简单数学技巧的解决方案。

在下面的文章中,我将使用XOR的和表示法和&的乘积表示法。

问题是如何计算F = sum F(i, j, k) = sum_{i, j, k} (A[i]|A[j]).A[k]

利用乘法(&)在加法(xor)上的分布性质,我们得到:

代码语言:javascript
运行
复制
F = sum_k A[k] . sum_{i, j} (A[i] | A[j])

我们注意到

代码语言:javascript
运行
复制
A[i] | A[j] = A[i] + A[j] + A[i].A[j]

然后

代码语言:javascript
运行
复制
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.因此,

代码语言:javascript
运行
复制
sum_{i, j} A[i].A[j] = sum_i A[i].A[i] = sum_i A[i]

我们在这里用的是A & A = A

最后,

代码语言:javascript
运行
复制
F = sum_k A[k] . sum_k A[k] = sum_k A[k]

解决方案是获取数组中所有元素的XOR。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70956544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档