Description
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:
Write a program to compute the nth element of the sequence, F(n). Does this problem sound familiar? Well it should! But we changed it a little!
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
4 1 1 2 4 3 11 4 1431655765
Sample Output
1 1/1 2 1/3 3 5/24 2178309/1346269
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int a[1005],dp[5005]; void add(int n,int &l,int &r){ if(n==1){ l=r=1; return; } int ll,rr; add(n/2,ll,rr); if(n%2) l=ll+rr,r=rr; else l=ll,r=ll+rr; } int main(){ int n,m,tmp;scanf("%d",&n); while(n--){ cin>>tmp>>m; int l,r; add(m,l,r); cout<<tmp<<" "<<l<<"/"<<r<<endl; } }