A Rational Sequence (Take 3)


D · A Rational Sequence (Take 3)

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:

 

 

A rational 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 to compute the nth element of the sequence, F(n). Does this problem sound familiar? Well it should! We had variations of this problem at the 2014 and 2015 Greater NY Regionals.


 

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, and the index, N, of the sequence element to compute (1 <= N <= 2147483647).

 

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 numerator of the fraction, followed immediately by a

forward slash (‘/’) followed immediately by the denominator of the fraction. Inputs will be chosen so neither the numerator nor the denominator will overflow an 32-bit unsigned integer.

 

 

Sample Input

Sample Output

4

1 1

2 4

3 11

4 1431655765

1 1/1

2 1/3

3 5/2

4 2178309/1346269

递归。(本来想手推数学规律。。

#include <cstdio>  
#include <cstring>  
#include <cmath>  
#include <iostream>  
#include <queue>
#include <set>
#include <string>
#include <stack>
#include <algorithm>
#include <map>
using namespace std;  
typedef long long ll;

const int INF = 0x3fffffff;
const int mod = 1e9+7;
#define maxn 200005 

typedef pair<int,int> PA;

 PA GetVal( int p )
{
	PA s;
	if( p == 1 ) return PA(1,1);
	PA t = GetVal(p/2);
	if( p%2 == 0 ){
		s.first = t.first;
		s.second = t.first+t.second;
	}else{
		s.first = t.first+t.second;
		s.second = t.second;
	}
	return s;
}

int main()
{
	int T;
	scanf("%d",&T);
	while( T-- ){
		int n,m;
		scanf("%d%d",&n,&m);
		PA ans = GetVal(m);
		printf("%d %d/%d\n",n,ans.first,ans.second);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值