***1133. Fibonacci Sequence(斐波那契数列,二分,数论)
2013-11-05 19:52
309 查看
1133. Fibonacci Sequence
Time limit: 1.0 secondMemory 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
相关文章推荐
- SPOJ FACVSPOW 数论+二分
- 无聊的函数(二分查找+数论)
- codeforces 300E Empire Strikes Back 数论+二分查找
- HDU 2256(数论,构造二分矩阵)
- (Relax 数论1.23)POJ 3122 Pie(二分搜索)
- [2017纪中10-30]Matrix 二分答案+数论
- hihoCoder 1133 二分·二分查找之k小数
- hdu 4549 M斐波那契数列(费马小定理 + 二分快速幂 + 矩阵快速幂)
- uva11428(数论+二分)
- HDOJ/HDU 1133 Buy the Ticket(数论~卡特兰数~大数~)
- 以斐波那契数列和二分查找为例——探究时间复杂度 和 空间复杂度
- codeforces 225B B. Well-known Numbers(数论+二分+贪心+构造)
- 20140911 【 初等数论 】 51nod 1242 . 斐波那契数列的第N项
- zoj 3665 数论 二分 两个参数
- Codeforces 483B Friends and Presents(二分+数论)
- FZU 1988 二分+数论
- 时间空间复杂度(二分查找和斐波那契数列)
- HDOJ/HDU 1133 Buy the Ticket(数论~卡特兰数~大数~)
- LS 38 Geometric sum(数论+二分快速幂)
- 154. Factorial (二分+数论)