1. 程式人生 > >[Codeforces Round #250 (Div. 1) -E] The Child and Binary Tree

[Codeforces Round #250 (Div. 1) -E] The Child and Binary Tree

Codeforces傳送門

洛谷傳送門

題目翻譯

我們的小朋友很喜歡電腦科學,而且尤其喜歡二叉樹。 考慮一個含有 n n 個互異正整數的序列 c [ 1 ]

, c [ 2 ] , . . . , c
[ n ] c[1],c[2],...,c[n] 。如果一棵帶點權的有根二叉樹滿足其所有頂點的權值都在集合 { c [
1 ] , c [ 2 ] , . . . , c [ n ] } \{c[1],c[2],...,c[n]\}
中,我們的小朋友就會將其稱作神犇的。並且他認為,一棵帶點權的樹的權值,是其所有頂點權值的總和。 給出一個整數 m m ,你能對於任意的 s ( 1 s m ) s(1\le s\le m) 計算出權值為 s s 的神犇二叉樹的個數嗎?請參照樣例以更好的理解什麼樣的兩棵二叉樹會被視為不同的。 我們只需要知道答案關於 998244353 998244353 取模後的值。

輸入第一行有 2 2 個整數 n , m ( 1 n 1 0 5 ; 1 m 1 0 5 ) n,m(1\le n\le 10^5; 1\le m\le 10^5) 。 第二行有 n n 個用空格隔開的互異的整數 c [ 1 ] , c [ 2 ] , . . . , c [ n ] 1 c [ i ] 1 0 5 ) c[1],c[2],...,c[n](1\le c[i]\le 10^5)

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

輸入輸出樣例

輸入樣例#1:

2 3
1 2

輸出樣例#1:

1
3
9

輸入樣例#2:

3 10
9 4 3

輸出樣例#2:

0
0
1
1
0
2
4
2
6
15

輸入樣例#3:

5 10
13 10 6 4 15

輸出樣例#3:

0
0
0
1
0
1
0
2
0
5

解題分析

考慮每個單獨的點的生成函式, 顯然為 r ( x ) = i S x i r(x)=\sum_{i\in S}x^i

由於二叉樹的結構可以遞迴形成, 那麼對於一個子樹的根節點, 設其生成函式為 F ( x ) F(x) , 那麼顯然就有 F ( x ) = r ( x ) F 2 ( x ) + 1 F(x)=r(x)F^2(x)+1 (空樹的情況要單獨算, 不能放進生成函式裡, 具體大家可以推幾步就知道了)。

由求根公式可得 F ( x ) = 1 ± 1 4 r ( x ) 2 r ( x ) F(x)=\frac{1\pm\sqrt{1-4r(x)}}{2r(x)}

先不論上面的正負號怎麼取, 下面的 2 r ( x ) 2r(x) 顯然是沒有 0 0 次項, 也就無法求逆。

然後有個顯然的轉化: 上下同乘 1 1 4 r ( x ) 1\mp \sqrt{1-4r(x)} ,可得 F ( x ) = 2 1 1 4 r ( x ) F(x)=\frac{2}{1\mp\sqrt{1-4r(x)}} ,那麼如果取到負號還是沒有零次項, 並且 F ( x ) F(x) 0 0 次項係數應該為 1 1 , 不滿足這個條件。所以最後的解為 2 1 + 1 4 r ( x ) \frac{2}{1+\sqrt{1-4r(x)}}

接下來考慮如何開根。設 F ( x ) = A ( x ) F(x)=\sqrt{A(x)} 還是那個牛頓迭代的套路:
F ( x ) = F 0 ( x ) G ( F 0 ( x ) ) G ( F 0 ( x ) ) F(x)=F_0(x)-\frac{G(F_0(x))}{G'(F_0(x))}
在這裡 G ( F ( x ) ) = F 2 ( x ) A ( x ) G(F(x))=F^2(x)-A(x) , 那麼就有 F ( x ) = F 0 ( x ) F 0 2 ( x ) A ( x ) 2 F 0 ( x ) F(x)=F_0(x)-\frac{F_0^2(x)-A(x)}{2F_0(x)}

遞迴處理即可。

程式碼如下:

#include <cstdio>
#include <cmath>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define R register
#define IN inline
#define W while
#define gc getchar()
#define MX 400500
#define ll long long
#define G 3
#define Ginv 332748118
#define MOD 998244353
template <class T>
IN void in(T &x)
{
	x = 0; R char c