题目名称:无限二叉树的公共祖先
测评方式
标准输入输出
时间限制
1000ms
内存限制
128MB
题目描述
描述:
如图所示,由正整数1, 2, 3, ...组成了一棵无限大 的二叉树。从某一个结点到根结点(编号是1的结 点)都有一条唯一的路径,比如从10到根结点的路径 是(10, 5, 2, 1),从4到根结点的路径是(4, 2, 1),从根结点1到根结点的路径上只包含一个结点1,因此路径就是(1)。对于两个结点x和y,假设他们到根结点的路径分别是(x1, x2, ... ,1)和(y1, y2, ... ,1)(这里显然有x = x1,y = y1),那么必然存在两个正整数i和j,使得从xi 和 yj开始,有xi = yj , xi + 1 = yj + 1, xi + 2 = yj + 2,... 现在的问题就是,给定x和y,要求xi(也就是yj)。
输入描述
数据输入:
输入只有一行,包括两个正整数x和y,这两个正整数
都不大于10^18。
输出描述
数据输出:
输出只有一个正整数xi。
样例1
10 4
输出
2
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
long long a,b;
cin >> a >> b;
int x1[1000005] = {0},y1[1000005] = {0};
int len1 = 0,len2 = 0;
while(a!=2 && a!=3){
if(a%2 == 0){
a/=2;
x1[len1] = a;
len1++;
}else{
a+=1;
a/=2;
x1[len1] = a;
len1++;
}
}
while(b!=2 && b!=3){
if(b%2 == 0){
b/=2;
y1[len2] = b;
len2++;
}else {
b+=1;
b/=2;
y1[len2] = b;
len2++;
}
}
for(int i = 0;i<len1;i++){
for(int j = 0;j<len2;j++){
if(x1[i] == y1[j]){
cout << x1[i];
return 0;
}
}
}
return 0;
}
求调,很急