#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <cstring> #include<iostream> #include<algorithm> using namespace std; // 比如,n = 12,m = 3那么上图中的结点13,14,15以及后面的结点都是不存在的, // 结点m所在子树中包括的结点有3,6,7,12,因此结点m的所在子树中共有4个结点。 // 输入数据包括多行,每行给出一组测试数据,包括两个整数m,n (1 <= m <= n <= 1000000000)。 //对于每一组测试数据,输出一行,该行包含一个整数,给出结点m所在子树中包括的结点的数目。 int main() { int n, m; scanf("%d %d", &m, &n); int level_n, level_m; int i = 1; while (true) { //获得m, n的层数 if (m > (1 << i - 1) && m < (1 << i)) { level_m = i; } if (n > (1 << i - 1) && n < (1 << i)) { level_n = i; break; } i++; } int left_side = m, right_side = m; for (int i = 0; i < level_n - level_m; i++) { left_side = left_side * 2; right_side = right_side * 2 + 1; } int NodeNum; if (left_side > n) { NodeNum = (1 << level_n - level_m) - 1; } else if (right_side >= n) { NodeNum = (1 << level_n - level_m) - 1; NodeNum += n - left_side + 1; } else { NodeNum = (1 << level_n - level_m + 1) - 1; } printf("%d\n", NodeNum); return 0; }