SPOJ 3899. Finding Fractions 连分数

 

连分数乱搞,我反正是一眼没看出结果

某巨巨把这题讲解的比较详细 : http://blog.csdn.net/gogdizzy/article/details/8727386

令k = [a/b] 然后对于a/b < p/q < c/d 就能得到 (a-bk)/b < (p-qk)/q < (c-dk)/d  即 a'/b < p'/q < c'/d ----------------------每项都是<1的

因为显然 a/b < 1 这时如果c/d>1,那么最终结果p = q = 1 也显然的

如果c/d<=1,我们把原不等式倒数一下 ,只需要求 d/c < q/p < b/a  然后就能递归求解满足上式了

因为 d/c < q/p 所以 q > d*p/c  所以 q = q * d / c + 1 

最后因为 p > q * a / b 所以 p = q * a / b + 1 

LL dfs(LL a , LL b , LL c , LL d)
{
    LL k = a/b;
    a = a-b*k; c = c-d*k;
    if(c > d) return 1;
    return d*dfs(d,c,b,a)/c+1;  
}
int main()
{
    //freopen("in.txt","r",stdin);
    LL a,b,c,d;
    while(~scanf("%lld%lld%lld%lld",&a,&b,&c,&d))
    {
        LL q = dfs(a,b,c,d);
        printf("%lld/%lld\n\n",a*q/b+1,q);
    }
    return 0;
}

 

posted @ 2013-07-27 16:10  Felix_F  阅读(194)  评论(0编辑  收藏  举报