小朋友和二叉樹

2021-10-01 15:39:39 字數 2753 閱讀 2580

description

我們的小朋友很喜歡電腦科學,而且尤其喜歡二叉樹。

考慮乙個含有n個互異正整數的序列c[1],c[2],…,c[n]。如果一棵帶點權的有根二叉樹滿足其所有頂點的權值都在集合中,我們的小朋友就會將其稱作神犇的。並且他認為,一棵帶點權的樹的權值,是其所有頂點權值的總和。

給出乙個整數m,你能對於任意的s(1<=s<=m)計算出權值為s的神犇二叉樹的個數嗎?請參照樣例以更好的理解什麼樣的兩棵二叉樹會被視為不同的。

我們只需要知道答案關於998244353(7×17×2^23+1,乙個質數)取模後的值。

input

第一行有2個整數 n,m(1<=n<=10^5; 1<=m<=10^5)。

第二行有n個用空格隔開的互異的整數 c[1],c[2],…,c[n](1<=c[i]<=10^5)。

output

輸出m行,每行有乙個整數。第i行應當含有權值恰為i的神犇二叉樹的總數。請輸出答案關於998244353(=7×17×2^23+1,乙個質數)取模後的結果。

首先很容易想到乙個柿子,也就是考慮當前點權值的選取情況,分別考慮左右子樹,f

if_i

fi​表示權值為i

ii的子樹的方案數,g

ig_i

gi​表示值i

ii有沒有在輸入的c

cc**現過,則:

f i=

∑j=0

igj∑

k=0i

−jfk

fi−j

−k

f_i=\sum_^g_j\sum_^ f_kf_

fi​=j=

0∑i​

gj​k

=0∑i

−j​f

k​fi

−j−k

​上式的本質是三個多項式求卷積,我們知道其中的g

gg,要求f

ff,可以用解方程的思想求f

ff,有下式:

f =g

×f×f

+1

f=g\times f\times f+1

f=g×f×

f+1其中1

11是空子樹,加到f

0f_0

f0​上面,可以把上式當成乙個一元二次方程解,所以f

ff可以表示為:

f =1

±1−4

g2

gf=\frac}

f=2g1±

1−4g

​​仔細考慮,發現如果取正號的話對於f

0f_0

f0​這一項是無意義的,所以f

ff只能用負號來算,柿子變為:

f =1

−1−4

g2

gf=\frac}

f=2g1−

1−4g

​​計算上面的柿子需要用到多項式求逆和多項式開根,可以看我的部落格學習。

我的**在vju

dg

evjudge

vjudge

和b zo

jbzoj

bzoj

上會t

\text

t,但是它是正確的。

#include

#include

using

namespace std;

const

int m =

500005

;const

int mod =

998244353

;const

int inv2 =

(mod+1)

/2;#define int long long

intread()

while

(c>=

'0'&& c<=

'9')

return x*f;

}int n,m,len,a[m]

,b[m]

,c[m]

,a[m]

,b[m]

,c[m]

,rev[m]

;int

qkpow

(int a,

int b)

return r;

}void

ntt(

int*a,

int len,

int op)

for(

int s=

2;s<=len;s<<=1)

}}if(op==1)

return

;int inv=

qkpow

(len,mod-2)

;for

(int i=

0;i) a[i]

=a[i]

*inv%mod;

}void

mul(

int n,

int*a,

int*b,

int*c)

void

work

(int n,

int*a,

int*b)

void

inv(

int n,

int*a,

int*b)

}void

sqr(

int n,

int*a,

int*b)

}signed

main()

BZOJ3625小朋友和二叉樹 生成函式

f的常數項為1,g的常數項為0,帶入方程,捨去減的根。說是因為不收斂?多項式開根 求逆 code附贈兩種開根寫法 include define pf printf define sf scanf define cs const define ll long long define db double...

二叉樹 滿二叉樹和完全二叉樹

二叉樹是一種很重要的非線性資料結構,它是樹結構的一種重要的型別 它不是樹結構的特殊情況 其特徵是每個節點最多有兩個子樹。二叉樹的特點 二叉樹每個結點最多有 2個子結點,樹則無此限制 二叉樹中 結點的子樹 分成左子樹和右子樹,即使某結點只有一棵子樹,也要指明該子樹是左子樹,還是右子樹,就是說 二叉樹是...

二叉樹和完全二叉樹

二叉樹規律 假設根節點的高度為0 二叉樹是每個節點至多只有兩個節點的樹 深度為i所在的層至多有 2 i個節點 高度為k的二叉樹至多有2 k 1 1個節點 n0表示度為0的節點,n2表示度為2的節點,存在n0 n2 1 對所有樹有 節點個數 邊數 1 完全二叉樹規律 節點數為n的完全二叉樹,其高度為 ...