为什么需要设置位数?

时间:2019-01-11 19:34:32

标签: bit-manipulation

我在codeforces 579 / A中发现了一个问题:

  

您是细菌的爱好者。您想在盒子里养一些细菌。

     

最初,该框为空。每天早上,您可以放任意数量的   细菌进入盒子。每天晚上,盒子里的所有细菌都会   分裂成两种细菌。您希望看到盒子里有x种细菌   在某个时刻。

     

您需要放入包装箱中的最小细菌数量是多少   在那些日子里?

     

输入唯一包含一个整数x(1≤x≤109)的行。

     

输出唯一包含一个整数的行:答案。

     

输入:5输出:2注意:对于第一个示例,我们可以添加一个   第一天早上和第三天早上盒子里的细菌   盒子里有4种细菌。现在我们再加一个结果5   在箱子里。我们在此过程中添加了2种细菌,所以答案是2。

我的问题是,为什么在这里使用设置位数来解决这个问题?

2 个答案:

答案 0 :(得分:2)

每次注入1种细菌,在 n 天后,细菌数将为2 n 。为了达到数字N,您必须看到其2的幂。

  

5是2 2 + 2 0 或4 + 1。

即二进制形式的5是101,这是您的注射计划!

达到5,

  • (1)添加1种细菌
  • (0)在一天后添加0种细菌和
  • (1)第二天添加1种细菌

可接受的最大二进制数为1091101101。要达到109,请先添加1,然后是一天后的1,然后是0,然后是1 ...

从左侧开始,

  • 第一个1在6天后将给出2 6 (64)
  • 第二个1在5天后将给出2 5 (32)
  • 第3个1在3天后将给出2 3 (8)
  • 然后... 5(4 + 1)

最后,要知道您需要注射多少细菌,只需计算目标二进制数中的1数即可。也就是说,设置的位数。

您可能想知道为什么有一天不注射多于1个?由于该问题对天数没有限制,因此,通过让细菌繁殖,可以“减少”使用细菌。这就是求幂的力量!

答案 1 :(得分:1)

每天放置的任何细菌都会变成1、2、4、8等细菌。例如,它不会变成三个。它始终是2的幂。 因此,如果所需数字不是2的幂,则需要将其作为2的幂的和。 这样的和的最小加法数是不重复2的幂,每个幂使用0或1次。数字表示为这样的2的幂,基本上就是将其转换为二进制表示,而对2的已用幂进行计数就是对设置为1的二进制数进行计数。