给定一个p,表示有(2^p) - 1
个数:[1, 2, 3, ..., (2^p - 1)]
每次操作: 选择两个x和y,交换他俩的某一个二进制位。 操作可以进行无数次。
问这些数的 最小的 >0
的 乘积。
我们交换x和y 的某一个二进制位,肯定是: 一个是1,一个是0.
对于交换二进制位这一操作,他不会影响 (x + y)的和!!
因为,一个数 += (1<<k),另一个数 -= (1 << k)
这一性质,非常非常重要!!!
首先我们将问题简化,先不看这n个数,而是先看2个数(因为,每次swap,是找两个数)
对于两个数x, y 来说,我们如何操作 可以使x * y
最小呢??
因为操作不影响两数的和,所以问题转换为: sum = x + y
,sum为定值,问x * y
的最小值
这其实是一个常识,当x和y的差距 为0,即x = y = sum / 2
时,x * y
最大。
因为x + y = sum
,所以,x和y 一定关于sum / 2
对称。 当他俩的距离越远,从上图可以看出,z
值变小。即x * y
的值 变小。
在本题中,不管怎么变,任何一个数 都必须 > 0
。
即在已知x + y = sum
的前提下