在计算机科学中,二叉树是一种树型数据结构,每个节点最多有两个孩子。考虑一个无限的完整二叉树(每个节点有两个子节点,除了叶节点)定义如下。对于标记为v的节点,其左侧的孩子将标记为2 * v,其右侧的孩子将标记为2 * v + 1。根标记为1。
你会得到n个表格i,j的查询。对于每个查询,您必须打印标记为i的节点和标记为j的节点之间的最短路径的长度。
输入
第一行包含n(1≤n≤10 ^ 5)查询的数量。每个查询由一行中的两个空格分隔的整数i和j(1≤i,j≤10^ 9)组成。
产量
对于每个查询,将所需的答案打印在一行中。
示例输入
五 1 2 2 3 4 3 1024 2048 3214567 9998877
示例输出
1 2 3 1 44
思路: 找到最近的祖先节点
#include <iostream>
#include<stdio.h>#include<math.h>
using namespace std;
int main()
{
int n;
long long a,b,t,ge;
scanf("%d",&n);
while(n--)
{
ge=0;
scanf("%lld%lld",&a,&b);
if(b<a)
{
t=a;
a=b;
b=t;
}
for(;;)
{
if(a==b)
break;
if(b>a)
b/=2;
else
a/=2;
ge++;
}
printf("%lld\n",ge);
}
return 0;
}