1. 程式人生 > >【洛谷mNOIP模擬賽Day1】T1 斐波那契

【洛谷mNOIP模擬賽Day1】T1 斐波那契

lld -s ace can using code 我們 namespace log

題目傳送門:https://www.luogu.org/problemnew/show/P3938

這題出得特別吼啊~~

通過打表或者大膽猜想斐波那契數列的一些性質,我們不難發現對於一只兔子$x$,其父親必為$x-Fk$($F$為斐波那契數列,且$F_{k}$為不大於$x$的最大數字),舉個例子:$7-5=2$,$11-8=3$,對於點$x$和點$y$,我們分別求出其所有直系祖宗,然後掃一遍即可。

由於斐波那契數列為指數級增長,故向上跳的復雜度為一個$log$級別,時間復雜度為$O(m*log(max(x_{i},y_{i})))$。

PS:最初我的想法是對於$x$的每一個祖宗都與$y$的祖宗進行比對,結果發現時間復雜度為增多一個$log$,有被卡風險,故寫了該題解的做法。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define L long long
 5 #define M 65
 6 using namespace std;
 7 L f[M]={0},fa[M]={0},fb[M]={0},an,bn;
 8 int main(){
 9     f[1]=1; f[2]=1; for(int i=3;i<M;i++) f[i]=f[i-1]+f[i-2];
10     int cas; cin>>cas; while
(cas--){ 11 //int x,y; scanf("%d%d",&x,&y); 12 L x,y; scanf("%lld%lld",&x,&y); 13 memset(fa,0,sizeof(fa)); memset(fb,0,sizeof(fb)); an=bn=0; 14 int t=1; while(f[t]<x) t++; 15 while(f[t]){ 16 while(f[t]>=x) t--; 17 fa[++an]=x; x-=f[t];
18 } 19 t=1; while(f[t]<y) t++; 20 while(f[t]){ 21 while(f[t]>=y) t--; 22 fb[++bn]=y; y-=f[t]; 23 } 24 int i,j; 25 for(i=an,j=bn;fa[i]==fb[j]&&i&&j;i--,j--); 26 printf("%lld\n",fa[i+1]); 27 //cout<<fa[i+1]<<endl; 28 } 29 30 }

【洛谷mNOIP模擬賽Day1】T1 斐波那契