题目:A sequence of positive rational numbers is defined as follows:
An infinite full binary tree labeled by positive rational numbers is defined by:
• The label of the root is 1/1.
• The left child of label p/q is p/(p + q).
• The right child of label p/q is (p + q)/q.
The top of the tree is shown in the following figure:
The sequence is defined by doing a level order (breadth first) traversal of the tree (indicated by the
light dashed line). So that:
F(1) = 1/1, F(2) = 1/2, F(3) = 2/1, F(4) = 1/3, F(5) = 3/2, F(6) = 2/3, …
Write a program which finds the value of n for which F(n) is p/q for inputs p and q.
题目大意:有一个二叉树,根节点为(1,1)。对于每一个节点(p,q),其左节点为(p,p+q),右节点为(p+q,q),先给出一个节点形如(p,q),请问其在原树的顺序中是第几个(即对原树进行BFS后本节点的BFS编号)。
题解:本题实际上就是一个二叉树的变种,对每一个读入的节点,我们都可以知道它的上一个节点,以此类推,可以知道其整个枝条。有由二叉树性质,每个节点o
的左右节点序号分别为o*2,o*2+1。通过递归即可轻松求出当前给出的编号。
代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int get(int n,int m)
{
if(n==m) return 1;
else if(n>m) return get(n-m,m) * 2 + 1;
else if(n<m) return get(n,m-n) * 2;
}
int n,m,k;
int main()
{
int kase;scanf("%d",&kase);
while(kase--){
scanf("%d%d/%d",&k,&n,&m);
printf("%d %d\n",k,get(n,m));
}
return 0;
}