题目描述
An infinite full binary tree labeled by positive rational numbers is defi ned by:
• The label of the root is 1/1.
• The left child of label p/q is p/(p+q).
• The right child ofl abel 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 which takes as input a rational number, p/q, in lowest terms and fi nds the next rational number in the sequence. That is, if F(n) = p/q, then the result is F(n + 1).
输入
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, which is then followed by a space, then the numerator of the fraction, p, followed immediately by a fonward slash (/),followed immediately by the denominator of the fraction, q. Both p and q will be relatively prime and 0 ≤ p, q ≤ 2147483647.
输出
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 such that neither the numerator nor the denominator will overfl ow a 32-bit integer.
样例输入
5
1 1/1
2 1/3
3 5/2
4 2178309/1346269
5 1/10000000
样例输出
1 1/2
2 3/2
3 2/5
4 1346269/1860498
5 10000000/9999999
找规律得出只要p<q,下一个一定为q/q-p;反之,则有往上找层数与他们的关系
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <string>
#define ull unsigned long long
using namespace std;
typedef long long ll;
int main()
{
ll t,n,a,b;
scanf("%d",&t);
for(int x=0;x<t;x++)
{
scanf("%lld %lld/%lld",&n,&a,&b);
if(a==b)
{
printf("%lld 1/2\n",n);
continue;
}
if(b==1)
{
printf("%lld 1/%lld\n",n,a+b);
continue;
}
if(b>a)
{
printf("%lld %lld/%lld\n",n,b,b-a);
continue;
}
else
{
if(b==2)
{
printf("%lld %lld/%lld\n",n,b,a);
continue;
}
ll tp=0;
tp=a/b;
a=a%b;
ll temp=a;
a=b;
b=b-temp;
b=a*tp+b;
printf("%lld %lld/%lld\n",n,a,b);
}
}
}