zoukankan      html  css  js  c++  java
  • 【ACdream 1187】Rational Number Tree(树,递归)

    有理数的树,根节点是1/1,左儿子是1/2,右儿子是2/1...。求给定的分数是第几个,或者给定n求第n个分数。
    递归。
    给定的分数,每次递归,如果分子比较小,就用分母减去分子,并且这是左儿子。反之是右儿子,终点是分子分母相等。
    求第n个,每次递归,如果n是奇数(为右儿子),新的分子是分子加分母。终点是n==1即到树根了,分子分母为1。

    #include<iostream>
    #define ll unsigned long long
    using namespace std;
    ll n,p,q,ans;
    void solve(ll n){
        if(n==1){
            p=1;
            q=1;
            return;
        }
        solve(n>>1);
        if(n%2)
            p+=q;
        else
            q+=p;
    }
    void work(){
        if(p==q){
            ans=1;
            return;
        }
        if(p>q){
            p-=q;
            work();
            ans=ans<<1|1;
        }else{
            q-=p;
            work();
            ans<<=1;
        }
    }
    int main(){
        int t,op;
        cin>>t;
        for(int i=1;i<=t;i++){
            cin>>op;
            cout<<"Case #"<<i<<": ";
            if(op==1){
                cin>>n;
                solve(n);
                cout<<p<<" "<<q<<"
    ";
            }else{
                cin>>p>>q;
                work();
                cout<<ans<<"
    ";
            }
        }
    }
      
  • 相关阅读:
    服务器重启后oracle监听无法打开
    Resport 四则运算
    For循环
    do...while循环
    Day03_Class01
    自学JavaDay02_class02
    自学JavaDay02_class01
    自学JavaDay01
    基本的Dos命令
    MarkDown语法
  • 原文地址:https://www.cnblogs.com/flipped/p/5697690.html
Copyright © 2011-2022 走看看