【洛谷mNOIP模擬賽Day1】T1 斐波那契
阿新 • • 發佈:2017-11-05
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 斐波那契