【纽约区域赛】-E-A Rational Sequence (递归,满二叉树)

E   A Rational Sequence   

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: 

《【纽约区域赛】-E-A Rational Sequence (递归,满二叉树)》
 
 
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. 
Greater New York Regional E • A Rational Sequence
 
Input 
 
The first line of input contains a single integer P, (1  P  1000), which is the number of data sets 
that follow. Each data set should be processed identically and independently. 
 
Each data set consists of a single line of input. It contains the data set number, K, a single space, the 
numerator, p, a forward slash (/) and the denominator, q, of the desired fraction. 
 
 
Output 
 
For each data set there is a single line of output. It contains the data set number, K, followed by a 
single space which is then followed by the value of n for which F(n) is p/q. Inputs will be chosen so n 
will fit in a 32-bit integer. 
 
 
 
Sample Input Sample Output 

1 1/1 
2 1/3 
3 5/2 
4 2178309/1346269 
 
1 1 
2 4 
3 11 
4 1431655765 

#include <cstdio>
#include <stack>
#include <queue>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
#define CLR(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
LL h;
LL search(LL a,LL b)		//返回当前节点,前面节点的个数 (再加上上面所有节点的个数((1<<h)-1)即可) 
{
	h++; 
	if(a==b)			//当返回根结点时,根节点前面没有节点,所以是 0 
		return 0;
	if(a>b)
		return (search(a-b,b))*2;
	if(a<b)
		return (search(a,b-a))*2-1;
}
int main()
{
	int u;
	LL k,a,b;
	scanf("%d",&u);
	while(u--)
	{
		h=0;
		scanf("%lld %lld/%lld",&k,&a,&b);
		printf("%lld %lld\n",k,search(a,b)+((LL)1<<h)-1);
	}
	return 0;
}

    原文作者:满二叉树
    原文地址: https://blog.csdn.net/Bear1998/article/details/59589617
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注