给定n个元素的数组a,我应该将a[i]
替换为a[i] XOR a[i+1]
,将a[n-1]
的值替换为a[n-1] XOR a[0]
m次。 m的值可以达到10 ^ 18。什么是最快最好的方法?
n, m = gets.chomp.split(" ").map &:to_i
arr = gets.chomp.split(" ")
m -= 1
m.times do
brr = arr.dup
i = 0.to_i
for i in 0..n-2
brr[i] = (arr[i].to_i ^ arr[i+1].to_i)
end
brr[n-1] = (arr[n-1].to_i ^ arr[0].to_i)
arr = brr.dup
p arr
puts ""
end
除了^运算符之外,还有更快的方法来计算XOR值吗?
答案 0 :(得分:2)
不再考虑特定数字,并考虑^
的基本数学规则:
^是关联的和可交换的,例如:
(x 1 ^ x 2 )^(x 3 ^ x 2 )= x 1 ^(x 2 ^ x 2 )^ x 3 = x 1 ^ 0 ^ x 3 = x 1 ^ x 3 。
根据x i 而不是实际的特定数字写出一个小数组(n = 3或4),并通过算法的几(m)次迭代应用这些规则。您将看到m> 1的重复模式出现。 Ñ
一旦你看到这个模式,Ruby的Array#rotate可能会让你非常方便(并提供一个非常快速的解决方案)。