POJ 2309 BST

假设最下面一层为第一层,可以看到,第一层全部为奇数,分解质因数后2的个数为0,依次向上,分解质因数后2的个数分别为1.2.3.4...而第N层的数与该数最左边和最右边的数的差都是2的N-1次方-1 ,所以该题就是求分解质因数后2的个数就可以了。

一开始是用依次除2的方法求的,后来超时了,突然想到了树状数组中求lowbit的方法,直接n&(-n)就得到结果了。

#include <cstdio>
#include <math.h>
using namespace std;
int main(){
	int nCase;
	scanf("%d",&nCase);
	while(nCase--){
		int n;
		scanf("%d",&n);
		int k=n&(-n);
		k--;
		printf("%d %d\n",n-k,n+k);	
	}
	return 0;
} 


你可能感兴趣的:(POJ 2309 BST)