URAL 1133 Fibonacci Sequence(数论)

题目链接

题意 :给你第 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

 

你可能感兴趣的:(fibonacci)