您的位置:首页 > 其它

【ACdream 1187】Rational Number Tree(树,递归)

2016-07-23 00:49 246 查看
有理数的树,根节点是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";
}
}
}
  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: