[Codeforces Round #250 (Div. 1) -E] The Child and Binary Tree
阿新 • • 發佈:2019-01-03
Codeforces傳送門
洛谷傳送門
題目翻譯
我們的小朋友很喜歡電腦科學,而且尤其喜歡二叉樹。 考慮一個含有 個互異正整數的序列 。如果一棵帶點權的有根二叉樹滿足其所有頂點的權值都在集合 中,我們的小朋友就會將其稱作神犇的。並且他認為,一棵帶點權的樹的權值,是其所有頂點權值的總和。 給出一個整數 ,你能對於任意的 計算出權值為 的神犇二叉樹的個數嗎?請參照樣例以更好的理解什麼樣的兩棵二叉樹會被視為不同的。 我們只需要知道答案關於 取模後的值。
輸入第一行有 個整數 。 第二行有 個用空格隔開的互異的整數 。
輸出 行,每行有一個整數。第 行應當含有權值恰為 神犇二叉樹的總數。請輸出答案關於 ,一個質數)取模後的結果。
輸入輸出樣例
輸入樣例#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
解題分析
考慮每個單獨的點的生成函式, 顯然為 。
由於二叉樹的結構可以遞迴形成, 那麼對於一個子樹的根節點, 設其生成函式為 , 那麼顯然就有 (空樹的情況要單獨算, 不能放進生成函式裡, 具體大家可以推幾步就知道了)。
由求根公式可得 。
先不論上面的正負號怎麼取, 下面的 顯然是沒有 次項, 也就無法求逆。
然後有個顯然的轉化: 上下同乘 ,可得 ,那麼如果取到負號還是沒有零次項, 並且 的 次項係數應該為 , 不滿足這個條件。所以最後的解為 。
接下來考慮如何開根。設
還是那個牛頓迭代的套路:
在這裡
, 那麼就有
。
遞迴處理即可。
程式碼如下:
#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