***1133. Fibonacci Sequence(斐波那契数列,二分,数论)

1133. Fibonacci Sequence

Time limit: 1.0 second
Memory limit: 64 MB
Problem illustration
is an infinite sequence of integers that satisfies to Fibonacci condition F i + 2 =  F i + 1 +  Fi for any integer  i. Write a program, which calculates the value of  Fn for the given values of  Fi and  Fj.

Input

The input contains five integers in the following order:  iFijFjn.
−1000 ≤  ijn ≤ 1000,  i ≠  j,
−2·10 9 ≤  Fk ≤ 2·10 9 ( k = min( ijn), …, max( ijn)).

Output

The output consists of a single integer, which is the value of  Fn.

Sample

inputoutput
3 5 -1 4 5
12

 

 

 1 #include <iostream>
 2 using namespace std;
 3 const int oo=2000000001;
 4 int now;
 5 __int64 i,fi,j,fj,n;
 6 __int64 l=-oo,r=oo,mid,sum[3];
 7 int main()
 8 {
 9     cin >> i >> fi >> j >> fj >> n;
10     if (i > j)
11     {
12         swap(i,j);
13         swap(fi,fj);
14     }//进行调整,使得i比j考前
15     while (l <= r)
16     {//进行二分
17         mid=(l+r)>>1;//先取中间值,mid表示第i+1个数的值
18         sum[0]=fi;
19         sum[now=1]=mid;
20         int k=i+2,flag=-2;
21         while (k <= j)
22         {//计算加法运算次数
23             now=(now+1)%3;
24             ++k;
25             sum[now]=sum[(now+2)%3]+sum[(now+1)%3];
26             if (sum[now] > oo)  flag=1;//向上超界了用1进行标记
27             else if (sum[now] < (-oo))  flag=-1;//超出了最低限用-1进行标记
28             if (flag != -2)  break;//超界了就不需要在进行运算了
29         }
30         if (flag == -2)
31         {
32             if (sum[now] > fj)  flag=1;//没有超界但是大于fj表示mid开大了
33             else if (sum[now] < fj)  flag=-1;//没有超界但是运算到了j小于fj表示mid开小了
34             else  flag=0;//mid开正确了
35         }
36         if (flag == 1)  r=mid-1;//开大了重置r
37         else if (flag == -1)  l=mid+1;//开小了总之L
38         else if (flag == 0)  break;//正好则跳出
39     }
40     sum[0]=fi;
41     sum[now=1]=mid;//进行模拟找到第n个数
42     if (i < n)
43     {
44         int k=i+2;
45         while (k <= n)
46         {
47             now=(now+1)%3;
48             ++k;
49             sum[now]=sum[(now+2)%3]+sum[(now+1)%3];
50         }
51     }
52     else if (i > n)
53     {
54         int k=i-1;
55         while (k >= n)
56         {
57             now=(now+1)%3;
58             --k;
59             sum[now]=sum[(now+2)%3]-sum[(now+1)%3];
60         }
61     }
62     else  --now;
63     cout << sum[now] << endl;
64     return 0;
65 }
View Code

 

 

转载于:https://www.cnblogs.com/zhangchengbing/p/3409176.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值