POJ-2499 Binary Tree

POJ-2499 Binary Tree

Binary Tree
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 5211   Accepted: 2420

Description

Background 

Binary trees are a common data structure in computer science. In this problem we will look at an infinite binary tree where the nodes contain a pair of integers. The tree is constructed like this: 

  • The root contains the pair (1, 1). 
  • If a node contains (a, b) then its left child contains (a + b, b) and its right child (a, a + b)


Problem 

Given the contents (a, b) of some node of the binary tree described above, suppose you are walking from the root of the tree to the given node along the shortest possible path. Can you find out how often you have to go to a left child and how often to a right child?

Input

The first line contains the number of scenarios. 

Every scenario consists of a single line containing two integers i and j (1 <= i, j <= 2*10
9) that represent 

a node (i, j). You can assume that this is a valid node in the binary tree described above.

Output

The output for every scenario begins with a line containing “Scenario #i:”, where i is the number of the scenario starting at 1. Then print a single line containing two numbers l and r separated by a single space, where l is how often you have to go left and r is how often you have to go right when traversing the tree from the root to the node given in the input. Print an empty line after every scenario.

Sample Input

3
42 1
3 4
17 73

Sample Output

Scenario #1:
41 0

Scenario #2:
2 1

Scenario #3:
4 6

 1 /*
 2 题意:根(a,b),则左孩子为(a+b,b),右孩子为(a,a+b)
 3     给定(m,n),初试根为(1,1),从(1,1)到(m,n)需要往左子树走几次,
 4     往右子树走几次。
 5 思路:逆向思维,从(m,n)到(1,1)。
 6     给定(m,n),求其父亲,如果m>n,则他父亲是(m-n,n),
 7     否则(m,n-m)。
 8 代码一:  ----TLE
 9 #include <iostream>
10 
11 using namespace std;
12 
13 int main()
14 {
15     int T, a, b, lcnt, rcnt;
16     cin >> T;
17     for(int i = 1; i <= T; ++i)
18     {
19         cin >> a >> b;
20         lcnt = rcnt = 0;
21         while(a != 1 || b != 1)
22         {
23             if(a >= b)
24             {
25                 ++lcnt;
26                 a -= b;
27             }
28             else
29             {
30                 ++rcnt;
31                 b -= a;
32             }
33         }
34         cout << "Scenario #" << i << ':' << endl;
35         cout << lcnt << ' ' << rcnt << endl <<endl;
36     }
37     return 0;
38 }
39 
40 代码二:
41 用除法代替减法,得到的商即为往左走的次数,最后的m=m%n。
42 n>m时情况类推。
43 需要特别注意的是:
44     如果m>n,m%n == 0 怎么办?因为根(1,1)不可能有0存在,所以特殊处理一下:
45 次数:m/n-1;m=1
46 */
47 #include <iostream>
48 
49 using namespace std;
50 
51 int main()
52 {
53     int T, a, b, lcnt, rcnt;
54     cin >> T;
55     for(int i = 1; i <= T; ++i)
56     {
57         cin >> a >> b;
58         lcnt = rcnt = 0;
59         while(a != 1 || b != 1)
60         {
61             if(a >= b)
62             {
63                 if(a % b)
64                 {
65                     lcnt += a/b;
66                     a %= b;
67                 }
68                 else
69                 {
70                     lcnt += a/b-1;
71                     a = 1;
72                 }
73             }
74             else
75             {
76                 if(b % a)
77                 {
78                     rcnt += b/a;
79                     b %= a;
80                 }
81                 else
82                 {
83                     rcnt += b/a-1;
84                     b = 1;
85                 }
86             }
87         }
88         cout << "Scenario #" << i << ':' << endl;
89         cout << lcnt << ' ' << rcnt << endl <<endl;
90     }
91     return 0;
92 }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110203.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 给ocx进行签名

    给ocx进行签名

    2022年7月13日
    15
  • APK签名流程介绍[通俗易懂]

    APK签名流程介绍[通俗易懂]实际上,现在Android开发IDE自带签名功能,但是有时我们还是可能遇到自己签名apk的场景的,比如你有一个未签名的apk,但是你要adbinstall到device上,这时我们在adbinstall之前就必须对该apk进行签名处理才能install成功,这篇文章就简单的介绍下apk签名流程吧。1、生成签名证书签名需要签名证书,签名证书类型实际上是有很多的,如jks、keysto…

    2022年6月13日
    42
  • 数据库常见面试题(附答案)

    数据库常见面试题(附答案)1.事务四大特性原子性,要么执行,要么不执行隔离性,所有操作全部执行完以前,其它会话不能看到过程一致性,事务前后,数据总额一致持久性,一旦事务提交,对数据的改变就是永久的2.数据库隔离级别,每个级别会引发什么问题,mysql默认是哪个级别脏读:事务B读取事务A还没有提交的数据不可重复读:两次事务读的数据不一致幻读:事务A修改了数据,事务B也修改了数据,这时在事务A看

    2022年5月2日
    75
  • mqttnet 详解_mqttnet 简记

    mqttnet 详解_mqttnet 简记1.mqttnet开源库,https://github.com/chkr1011/MQTTnet2.服务器端和客户端服务器端和客户端两个,他们需要保持长连接,主要是通过订阅和发布来进行消息的传递交换。MQTT服务端主要用于与多个客户端保持连接,并处理客户端的发布和订阅等逻辑。一般很少直接从服务端发送消息给客户端(可以使用mqttServer.Publish(appMsg);直接发送消息),多…

    2022年6月25日
    104
  • linux中的两个命令setfacl和chmod有什么区别

    linux中的两个命令setfacl和chmod有什么区别

    2021年10月15日
    32
  • MySQL数据库:drop、truncate、delete的区别

    MySQL数据库:drop、truncate、delete的区别

    2021年4月9日
    124

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号