斐波那契樹


原題:斐波那契樹

\(Description\)

定義滿足下面條件的樹是斐波拉契樹:
  • 這棵樹的節點要么是白色,要么是黑色。
  • 每一個非葉子的白色節點,有且僅有一個黑色節點作為兒子;每一個非葉子的黑色節點,有且僅有一個黑色節點和一個白色節點作為兒子。
  • 根節點為白色節點。
現在給你樹的深度\(n\),每個葉子節點的深度都為\(n\),問求距離為\(d\)的白色點對一共有多少對?
需要求出\(1\leq d\leq2∗n\)的每一個取值的答案。

\(Input\) \(Format\)

輸入僅一行,一個整數nn,表示這個斐波拉契樹的深度。

\(Output\) \(Format\)

輸出共\(2*n\)個整數,第\(i\)個整數表示當\(d=i\)的時候的答案,答案\(mod 123456789\)

\(Sample\) \(Input\)

5

\(Sample\) \(Output\)

0 2 3 3 1 1 0 0 0 0

\(Solution\)

首先為什么這棵樹叫斐波那契樹
這是一張\(n=6\)的圖:

每層黑色與白色的點的個數似乎就是斐波那契數列!
前幾個值如下
顏色\層數 \(1\) \(2\) \(3\) \(4\) \(5\) \(6\)
\(white\) \(1\) \(0\) \(1\) \(1\) \(2\) \(3\)
\(black\) \(0\) \(1\) \(1\) \(2\) \(3\) \(5\)
還有一點,斐波那契樹的每棵子樹都反復出現在圖里!!
那這兩個性質怎么用呢?
再分析下題目:
兩個點距離為\(d\)的白色節點有兩種情況
1.兩個點在同一條鏈上,此時它們的\(lca\)是白色節點

2.兩個點距其\(lca\)的和為\(d\),它們的\(lca\)是黑色節點(與第一種情況沒有重復)

對第一種情況,若枚舉可成為兩個白色節點的\(lca\)的白色節點的個數與長度,顯然是行不通的
這時我們就可以將這一段鏈迭代到一號節點上去:

於是長度為\(d\)的點對個數為 可充當上面白色節點的個數*可充當下面白色節點的個數
由於迭代,后者顯然是第\(d\)行白色節點的個數
而前者則是\(n-i\)行及之前一共的白色節點的個數
若用\(f[i]\)表示距離為\(i\)的白色點對有多少個
第一種情況時\(f[i]+=sumw[n-i]*w[i+1]\)其中\(sum[k]\)代表在\(k\)行及之前一共的白點數量,\(w[k]\)代表第\(k\)行一共的白點個數
對第二種情況也可以用類似的迭代方法:

可以將其\(lca\)這個黑節點迭代到二號節點上:

這時我們就可以枚舉兩個白色節點到其\(lca\)的長度\(i\)\(j\)
那可以充當兩個白色節點的\(lca\)的黑色節點的個數僅有\(n-max(i,j)\)
而對兩個白色節點可取的范圍分別在其左右子樹上,於是可以再進行一次迭代:

可以看出,其左右能取的白色節點個數將變成第\(i\)行及第\(j+1\)行的白色節點個數
於是可以寫出式子\(f[i+j]+=sumb[n-max(i,j)]*w[i]*w[j+1]\)
而對\(w[]\)\(sumw[]\)\(sumb[]\)可以用斐波那契樹的斐波那契數列性質求出
代碼如下:
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
const int P=123456789;
typedef long long ll;
ll n;
ll w[N],b[N],sumw[N],sumb[N],f[N];
int main(){
	scanf("%lld",&n);
	sumw[1]=sumw[2]=sumb[2]=w[1]=b[2]=1,sumb[1]=w[2]=b[1]=0;
	for(ll i=3;i<=n;i++){
		w[i]=(w[i-1]+w[i-2])%P;
		b[i]=(b[i-1]+b[i-2])%P;
		sumw[i]=(sumw[i-1]+w[i])%P;
		sumb[i]=(sumb[i-1]+b[i])%P;
	}
	for(ll i=1;i<=n;i++)f[i]=(sumw[n-i]*w[i+1])%P;
	for(ll i=1;i<=n;i++)for(ll j=1;j<=n;j++)f[i+j]=(f[i+j]+sumb[n-max(i,j)]*w[i+1]%P*w[j]%P)%P;
	for(ll i=1;i<=n*2;i++)printf("%lld ",f[i]);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM