[bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函數+多項式運算+FFT)

3625: [Codeforces Round #250]小朋友和二叉樹

Time Limit:?40 Sec??Memory Limit:?256 MB
Submit:?650??Solved:?283
[Submit][Status][Discuss]

Description

我們的小朋友很喜歡計算機科學,而且尤其喜歡二叉樹。
考慮一個含有n個互異正整數的序列c[1],c[2],...,c[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,一個質數)取模后的結果。

Sample Input

樣例一:
2 3
1 2
樣例二:
3 10
9 4 3
樣例三:
5 10
13 10 6 4 15

Sample Output

樣例一:
1
3
9
樣例二:
0
0
1
1
0
2
4
2
6
15
樣例三:
0
0
0
1
0
1
0
2
0
5

HINT

?

對于第一個樣例,有9個權值恰好為3的神犇二叉樹:

?

Source

VFleaKing & pyx1997 感謝wyl8899提供中文翻譯

https://www.cnblogs.com/neighthorn/p/6497364.html

利用了二叉樹的遞歸定義,注意空樹情況要加一,因為生成函數的$x^0$為$0$,也就是默認了根節點必須有數。

剩下的就是多項式開根和逆元了。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define rep(i,l,r) for (int i=l; i<=r; i++)
 4 typedef long long ll;
 5 using namespace std;
 6 
 7 const int N=(1<<18)+100,P=998244353,g=3,inv2=(P+1)/2;
 8 int n,x,m,c[N],a[N],f[N],t[N],ib[N],rev[N];
 9 
10 int ksm(ll a,int b){
11    ll res;
12    for (res=1; b; a=(a*a)%P,b>>=1)
13       if (b & 1) res=res*a%P;
14    return res;
15 }
16 
17 void DFT(int a[],int n,int f){
18    rep(i,0,n-1) if (i<rev[i]) swap(a[i],a[rev[i]]);
19    for (int i=1; i<n; i<<=1){
20       ll wn=ksm(g,(f==1) ? (P-1)/(i<<1) : (P-1)-(P-1)/(i<<1));
21       for (int j=0,p=i<<1; j<n; j+=p){
22          ll w=1;
23          for (int k=0; k<i; k++,w=1ll*w*wn%P){
24             int x=a[j+k],y=1ll*w*a[i+j+k]%P;
25             a[j+k]=(x+y)%P; a[i+j+k]=(x-y+P)%P;
26          }
27       }
28    }
29    if (f==-1){
30       int inv=ksm(n,P-2);
31       rep(i,0,n-1) a[i]=1ll*a[i]*inv%P;
32    }
33 }
34 
35 void inverse(int a[],int b[],int l){
36    if (l==1){ b[0]=ksm(a[0],P-2); return; }
37    inverse(a,b,l>>1);
38    int n=1,L=0; while (n<(l<<1))n<<=1,L++;
39    rep(i,0,n-1) rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1));
40    rep(i,0,l-1) t[i]=a[i];
41    rep(i,l,n-1) t[i]=0;
42    DFT(t,n,1); DFT(b,n,1);
43    rep(i,0,n-1) b[i]=1ll*b[i]*(2-1ll*t[i]*b[i]%P+P)%P;
44    DFT(b,n,-1);
45    rep(i,l,n-1) b[i]=0;
46 }
47 
48 void Sqrt(int a[],int b[],int l){
49    if (l==1) { b[0]=1; return; }
50    Sqrt(a,b,l>>1);
51    int n=1,L=0; while (n<(l<<1)) n<<=1,L++;
52    rep(i,0,n-1) ib[i]=0;
53    inverse(b,ib,l);
54    rep(i,0,n-1) rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1));
55    rep(i,0,l-1) t[i]=a[i];
56    rep(i,l,n-1) t[i]=0;
57    DFT(t,n,1); DFT(b,n,1); DFT(ib,n,1);
58    rep(i,0,n-1) b[i]=1ll*inv2*(b[i]+1ll*t[i]*ib[i]%P)%P;
59    DFT(b,n,-1);
60    rep(i,l,n-1) b[i]=0;
61 }
62 
63 int main(){
64    freopen("bzoj3625.in","r",stdin);
65    freopen("bzoj3625.out","w",stdout);
66    scanf("%d%d",&n,&m); c[0]=1;
67    rep(i,1,n) scanf("%d",&x),c[x]-=4;
68    rep(i,0,m) if (c[i]<0) c[i]+=P;
69    int len=1; while (len<=m) len<<=1;
70    Sqrt(c,a,len);
71    a[0]++; if (a[0]>=P) a[0]-=P;
72    inverse(a,f,len);
73    rep(i,1,m) printf("%d\n",f[i]*2%P);
74    return 0;
75 }

?

轉載于:https://www.cnblogs.com/HocRiser/p/8270671.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252528.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252528.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252528.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

常用內建模塊

一.datetime 1.模塊導入: from datetime import datetime 2.獲取當前日期和時間: >>> now datetime.now() >>> print(now) 2019-01-13 14:19:38.1810003.獲取指定日期和時間: >>> dt datetime(2019,1,10,15,0) >>> print(dt) 2019-01-10…

子序列進階問題

題目&#xff1a; 有一個數組&#xff0c;讓找到兩個不重復的連續子序列A,B &#xff0c;求Max(Sum(A)-Sum(B) 分析&#xff1a; AB必定連續&#xff0c;設兩端連接處index為{X&#xff0c;x1}&#xff0c;X可取0~n-1 設F(x)為連接處index為{X&#xff0c;x1}時 Max(Sum(A)…

day5-shelve模塊

一、概述前面章節我們講述了json和pickle模塊的序列化和反序列化處理&#xff0c;他們有一個不足是在python 3中不能多次dump和load&#xff0c;shelve模塊則可以規避這個問題。shelve模塊是一個簡單的k,v將內存數據通過文件持久化的模塊&#xff0c;可以持久化任何pickle可支持…

程序員:請你不要對業務「置之不理」

成長是條孤獨的路&#xff0c;一個人會走得更快&#xff1b;有志同道合者同行&#xff0c;會走得更遠。本篇內容整理自 21 天鯤鵬新青年計劃線上分享內容。鯤鵬新青年計劃是由 TGO 鯤鵬會組織的線上分享活動&#xff0c;希望能幫助更多同學一起學習、成長。12 月 28 日&#xf…

在Ubuntu系統下如何將chrome瀏覽器的bookmarks導出到本地

1. 打開chrome瀏覽器在頁面的右上角點擊那個三個小點的位置&#xff0c;找到bookmarks&#xff0c;然后點擊bookmarks manager,然后在organize右側大倒三角下選擇&#xff0c;export bookmarks to HTML&#xff0c;選擇要保存的位置&#xff0c;利用同樣的方法下次就可以直接導…

php基于數組的分頁實現

關于數組的分頁函數,用數組進行分頁的好處是可以方便的進行聯合多表查詢,只需要將查詢的結果放在數組中就可以了以下是數組分頁的函數,函數page_array用于數組的分頁&#xff0c;函數show_array用于分頁函數的操作及顯示&#xff0c;需要配合使用.兩個函數通過全局變量$countpa…

028 -bash-4.1$ 出現故障的原理及解決辦法?

最近在搭建分布式的時候&#xff0c;出現了這個問題&#xff0c;很不爽。下面是我的解決方式。 1.在用戶下刪除bash rm -rf /home/beifeng/.bash* 2.拷貝 cp /etc/skel/.bash* /home/beifeng 3.退出&#xff0c;再進入用戶 4.解釋 set |grep -i ps1 轉載于:https://www.cnblogs…

彈出ifream

top.$.jBox("iframe:"${ctx}/synopsis/hmlwxSynopsis/addItem, {title: "添加作品",width: 1000, height: 500, buttons:{關閉: true,確定:ok},submit:function(v, h, f){},loaded: function (jboxContent) {$(jboxContent).css(overflow-x,);$(jboxConten…

ORB-SLAM2中的Loop Closinng中DetectLoopCandidates函數解析

/函數的三要素是&#xff1a;函數返回值類型&#xff0c;函數名稱&#xff0c;函數參數 函數的返回值是裝有關鍵幀指針的vector 該函數是類KeyFrameDatabase的成員函數,函數名是DetectLoopCandidate 該函數的參數分別是KeyFrame類型的指針變量 pKF和最小得分vector<KeyFrame…

NYOJ2—括號配對問題

括號配對問題 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB 難度&#xff1a;3描述現在&#xff0c;有一行括號序列&#xff0c;請你檢查這行括號是否配對。輸入第一行輸入一個數N&#xff08;0<N<100&#xff09;,表示有N組測試數據。后面的N行輸入多…

李彥宏千字愿景內部信:10次提到“用戶”

中新網1月17日電 1月17日&#xff0c;百度公司創始人、董事長兼CEO李彥宏發出一封內部信&#xff0c;信中&#xff0c;李彥宏向員工闡述了百度愿景&#xff1a;成為最懂用戶&#xff0c;并能幫助人們成長的全球頂級高科技公司。他提出&#xff0c;百度要持續創新&#xff0c;“…

spring-boot 速成(8) 集成druid+mybatis

spring-boot與druid、mybatis集成&#xff08;包括pageHelper分頁插件&#xff09;, 要添加以下幾個依賴項: compile(mysql:mysql-connector-java:6.0.5)compile(tk.mybatis:mapper-spring-boot-starter:1.1.1)compile(org.mybatis.spring.boot:mybatis-spring-boot-starter:1.…

ORB-SLAM2中生成金字塔提取FAST角點和計算BRIEF描述子

//這個是類ORBextractor的帶參構造函數&#xff0c;并且使用初始化列表對該類中的這5個變量賦值 ORBextractor::ORBextractor(int _nfeatures, float _scaleFactor, int _nlevels,int _iniThFAST, int _minThFAST):nfeatures(_nfeatures), scaleFactor(_scaleFactor), nlevels(…

我們怎樣確保從大數據計算中獲得價值

我們怎樣確保從大數據計算中獲得價值 支持大數據方案并不是在硬件以及軟件層次終止&#xff0c;企業要想真正地從大數據中受益&#xff0c;領導者必須改變思考與對待信息的方式。 我們怎樣確保從大數據計算中獲得價值&#xff1f; 當所有可用數據都可用時&#xff0c;大數據…

jsoncpp-src-0.5.0.tar.gz 源碼錯誤!!!!

近期在做畢設&#xff0c;使用到了JsonCpp0.5.0版本號的源碼&#xff01;依照網上的安裝配置教程&#xff0c;搭建好環境后就能夠使用了&#xff01; 在這里就不浪費空間去將怎樣搭建開發環境了&#xff01;請大家去google一下就好了&#xff01;在解析一個Json文件時。程序總是…

青海省多地日降水量突破歷史極值

受高原槽和西北冷空氣的共同影響&#xff0c;青海省海西州茫崖等多地日降水量突破歷史極值。 李萬花 攝 受高原槽和西北冷空氣的共同影響&#xff0c;青海省海西州茫崖等多地日降水量突破歷史極值。 李萬花 攝 中新網西寧1月18日電 (孫睿 趙海梅)記者18日從青海省氣象局獲悉&am…

ORB-SLAM2中四叉樹管理特征點

當從圖像金字塔中的每一層圖像上提取特征點之后&#xff0c;都要先用四叉樹技術對這些特征點進行管理 //該類中定義了四叉樹創建的函數以及樹中結點的屬性 //bool bNoMore&#xff1a; 根據該結點中被分配的特征點的數目來決定是否繼續對其進行分割 //DivisionNode()&#xff…

Python多線程3:queue

queue模塊實現了多生產者。多消費者隊列。在多線程環境下&#xff0c;該隊列能實現多個線程間安全的信息交換。 queue模塊介紹 模塊實現了3種類型的隊列&#xff0c;差別在于隊列中條目檢索的順序不同。在FIFO隊列中。依照先進先出的順序檢索條目。在LIFO隊列中&#xff0c;最后…

微信小程序教程02:App(Object)和Page(Object) 構造器介紹

在/app.js中&#xff0c;有方法App&#xff0c;它的作用是注冊整個小程序的應用&#xff0c;其中可以傳入一些配置&#xff0c;或者存儲全局狀態。 App(Object) 構造器生命周期 屬性類型描述onLaunchFunction在小程序初始化時觸發&#xff0c;全局僅觸發一次onShowFunction小程…