您的位置:首页 > 产品设计 > UI/UE

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

2013-11-05 19:52 309 查看

1133. Fibonacci Sequence

Time limit: 1.0 second
Memory limit: 64 MB

#include <iostream>
using namespace std;
const int oo=2000000001;
int now;
__int64 i,fi,j,fj,n;
__int64 l=-oo,r=oo,mid,sum[3];
int main()
{
cin >> i >> fi >> j >> fj >> n;
if (i > j)
{
swap(i,j);
swap(fi,fj);
}//进行调整,使得i比j考前
while (l <= r)
{//进行二分
mid=(l+r)>>1;//先取中间值,mid表示第i+1个数的值
sum[0]=fi;
sum[now=1]=mid;
int k=i+2,flag=-2;
while (k <= j)
{//计算加法运算次数
now=(now+1)%3;
++k;
sum[now]=sum[(now+2)%3]+sum[(now+1)%3];
if (sum[now] > oo)  flag=1;//向上超界了用1进行标记
else if (sum[now] < (-oo))  flag=-1;//超出了最低限用-1进行标记
if (flag != -2)  break;//超界了就不需要在进行运算了
}
if (flag == -2)
{
if (sum[now] > fj)  flag=1;//没有超界但是大于fj表示mid开大了
else if (sum[now] < fj)  flag=-1;//没有超界但是运算到了j小于fj表示mid开小了
else  flag=0;//mid开正确了
}
if (flag == 1)  r=mid-1;//开大了重置r
else if (flag == -1)  l=mid+1;//开小了总之L
else if (flag == 0)  break;//正好则跳出
}
sum[0]=fi;
sum[now=1]=mid;//进行模拟找到第n个数
if (i < n)
{
int k=i+2;
while (k <= n)
{
now=(now+1)%3;
++k;
sum[now]=sum[(now+2)%3]+sum[(now+1)%3];
}
}
else if (i > n)
{
int k=i-1;
while (k >= n)
{
now=(now+1)%3;
--k;
sum[now]=sum[(now+2)%3]-sum[(now+1)%3];
}
}
else  --now;
cout << sum[now] << endl;
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: