[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.mzph.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小程…