#include <stdio.h>
int main()
{
puts("转载请注明出处");
puts("地址:blog.csdn.net/vmurder/article/details/43636437");
}
题解:
发现我们可以保证同时至多出现两个数A和A+1。
然后记录这两个数的数目a、b。
每次向下>>时,
如果A是奇数,那么新的计数器就应该是a,a+b
如果A是偶数,那么新的计数器就应该是a+b,b
时间复杂度log级别
代码:
m=int(raw_input())
while m:
m=m-1
a=int(1)
b=int(0)
n=int(raw_input())
while n:
if n%2==1 : b=a+b
else : a=a+b
n=n/2
print(b)