标签:
有理数的树,根节点是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<<"\n"; }else{ cin>>p>>q; work(); cout<<ans<<"\n"; } } }
【ACdream 1187】Rational Number Tree(树,递归)
标签:
原文地址:http://www.cnblogs.com/flipped/p/5697690.html