我在codeforces 579 / A中发现了一个问题:
您是细菌的爱好者。您想在盒子里养一些细菌。
最初,该框为空。每天早上,您可以放任意数量的 细菌进入盒子。每天晚上,盒子里的所有细菌都会 分裂成两种细菌。您希望看到盒子里有x种细菌 在某个时刻。
您需要放入包装箱中的最小细菌数量是多少 在那些日子里?
输入唯一包含一个整数x(1≤x≤109)的行。
输出唯一包含一个整数的行:答案。
输入:5输出:2注意:对于第一个示例,我们可以添加一个 第一天早上和第三天早上盒子里的细菌 盒子里有4种细菌。现在我们再加一个结果5 在箱子里。我们在此过程中添加了2种细菌,所以答案是2。
我的问题是,为什么在这里使用设置位数来解决这个问题?
答案 0 :(得分:2)
每次注入1种细菌,在 n 天后,细菌数将为2 n 。为了达到数字N,您必须看到其2的幂。
5是2 2 + 2 0 或4 + 1。
即二进制形式的5是101
,这是您的注射计划!
达到5,
可接受的最大二进制数为109
或1101101
。要达到109,请先添加1,然后是一天后的1,然后是0,然后是1 ...
从左侧开始,
最后,要知道您需要注射多少细菌,只需计算目标二进制数中的1
数即可。也就是说,设置的位数。
您可能想知道为什么有一天不注射多于1个?由于该问题对天数没有限制,因此,通过让细菌繁殖,可以“减少”使用细菌。这就是求幂的力量!
答案 1 :(得分:1)
每天放置的任何细菌都会变成1、2、4、8等细菌。例如,它不会变成三个。它始终是2的幂。 因此,如果所需数字不是2的幂,则需要将其作为2的幂的和。 这样的和的最小加法数是不重复2的幂,每个幂使用0或1次。数字表示为这样的2的幂,基本上就是将其转换为二进制表示,而对2的已用幂进行计数就是对设置为1的二进制数进行计数。