A Rational Sequence (Take 3)(UVALive 7786)

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:
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 n-th 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

4
1 1
2 4
3 11
4 1431655765

Sample Output

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

题解:

根据二叉树性质和所给公式递推(暴力

代码如下:

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<map>
#include<set>
#define max(a,b)   (a>b?a:b)
#define min(a,b)   (a<b?a:b)
#define swap(a,b)  (a=a+b,b=a-b,a=a-b)
#define maxn 27
#define N 100000000
#define INF 0x3f3f3f3f
#define mod 1001113
#define e  2.718281828459045
#define eps 1.0e18
#define PI acos(-1)
#define lowbit(x) (x&(-x))
#define read(x) scanf("%d",&x)
#define put(x) prllf("%d\n",x)
#define memset(x,y) memset(x,y,sizeof(x))
#define Debug(x) cout<<x<<" "<<endl
#define lson i << 1,l,m
#define rson i << 1 | 1,m + 1,r
#define ll long long
//std::ios::sync_with_stdio(false);
//cin.tie(NULL);
//const int maxn=;
using namespace std;

struct ttt
{
    ll a;
    ll b;
}s,f;
ttt qaq(ll n)
{
    if(n==1)
    {
        s.a=1;
        s.b=1;
    }
    else if(n%2==0)
    {
        f=qaq(n/2);
        s.a=f.a;
        s.b=f.a+f.b;
    }
    else
    {
        f=qaq(n/2);
        s.a=f.a+f.b;
        s.b=f.b;
    }
    return s;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll p,n;
        cin>>p>>n;
        qaq(n);
        cout<<p<<" "<<s.a<<"/"<<s.b<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值