假设最下面一层为第一层,可以看到,第一层全部为奇数,分解质因数后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;
}