题目链接

题意 :给你第 i 项的值fi,第 j 项的值是 fj 让你求第n项的值,这个数列满足斐波那契的性质,每一项的值是前两项的值得和。 

思路 :知道了第 i 项第j项,而且还知道了每个数的范围,二分求第 i+1项,然后根据性质求下去,求到第 j 项的时候看看通过二分求出来的值与给定的第j项的值大小关系,来确定下一次二分的值,输出的时候注意方向。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>

using namespace std ;
#define LL long long

int main()
{
    LL i,fi,j,fj,n ;
    while(~scanf("%I64d %I64d %I64d %I64d %I64d",&i,&fi,&j,&fj,&n))
    {
        if(i > j)
        {
            swap(i,j) ;
            swap(fi,fj) ;
        }
        LL start,endd,mid,a,b,c ;
        start = -2000000000LL ,endd = 2000000000LL ;
        while(start + 1 < endd)
        {
            mid = (start + endd) / 2 ;
            a = fi ;
            b = mid ;
            for(int k = i+2 ; k <= j ; k++)
            {
                c = a + b ;
                a = b ;
                b = c ;
                if(c > 4000000001LL || c < -4000000001LL)
                    break ;
            }
            if(b < fj)
            {
                start = mid ;
            }
            else endd = mid ;
        }
        a = fi ;
        b = endd ;
        if(n >= i + 1)
        {
            for(int k = i + 2 ; k <= n ; k++)
            {
                c = a+b ;
                a = b ;
                b = c ;
            }
            printf("%I64d\n",b) ;
        }
        else
        {
            for(int k = i-1 ; k >= n ; k--)
            {
                c = b-a ;
                b = a ;
                a = c ;
            }
            printf("%I64d\n",a) ;
        }
    }
    return 0 ;
}
View Code

 

posted on 2014-10-20 19:37  枫、  阅读(273)  评论(0编辑  收藏  举报