码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷 3938 斐波那契

时间:2017-11-02 11:34:09      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:大于   alt   9.png   src   const   大于等于   bsp   pac   inline   

技术分享

 

技术分享

 技术分享

技术分享

技术分享

【题解】

我们可以发现,对于一只编号为a的兔子,a的父亲的编号是a-f[x],其中x为a出生的月份。

而计算a出生月份的方法是:找到第一个大于等于a的f[x],x即为a出生的月份。

那么我们只要不断的找a与b的父亲,直到它们相等即可。

技术分享
 1 #include<cstdio>
 2 #include<algorithm>
 3 #define LL long long
 4 using namespace std;
 5 const int maxn=300010;
 6 LL n,m,a,b;
 7 LL f[maxn];
 8 void read(LL &k){
 9     k=0; int f=1; char c=getchar();
10     while(c<0||c>9)c==-&&(f=-1),c=getchar();
11     while(0<=c&&c<=9)k=k*10+c-0,c=getchar();
12     k*=f;
13 }
14 inline LL find(LL a,LL &last){
15     int l=1,r=last,mid;
16     while(l<r)if (f[mid=(l+r)>>1]>=a) r=mid; else l=mid+1;
17     last=l-1; return a-f[l-1];
18 } 
19 int main(){
20     f[0]=1; f[1]=1;
21     for (int i=2;i<=60;i++)f[i]=f[i-1]+f[i-2];
22     read(m); 
23     for (int i=1;i<=m;i++){
24         read(a); read(b);
25         LL posa=60,posb=60;
26         while(a!=b&&a>1&&b>1){
27             if (a>b) a=find(a,posa);
28             else b=find(b,posb);
29         }
30         printf("%lld\n",a==b?a:1);
31     }
32     return 0; 
33 }
View Code

洛谷 3938 斐波那契

标签:大于   alt   9.png   src   const   大于等于   bsp   pac   inline   

原文地址:http://www.cnblogs.com/DriverLao/p/7770518.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!