题意 :给你第 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 ; }
时间: 2024-10-07 20:00:38