2019.01.01 bzoj3625:小朋友和二叉树(生成函数+多项式求逆+多项式开方)

传送门
codeforces传送门codeforces传送门codeforces
生成函数好题。
卡场差评至今未过
题意简述:nnn个点的二叉树,每个点的权值KaTeX parse error: Expected 'EOF', got '\inC' at position 4: v_i\̲i̲n̲C̲=\{a_1,a_2,...a…,定义一棵树的权值为所有点的权值之和,问有多少棵树满足其权值等于i(i=1,2,...,m)i(i=1,2,...,m)i(i=1,2,...,m)


对每个点的值构造生成函数g(x)=∑nanxn(an=[n∈C])g(x)=\sum_na_nx^n(a_n=[n\in C])g(x)=nanxn(an=[nC]),令f(x)f(x)f(x)表示答案的生成函数。
那么f(x)=g(x)f2(x)+1f(x)=g(x)f^2(x)+1f(x)=g(x)f2(x)+1 注意空树的情况,这个递推式相当于考虑自己的权值以及左右子树的权值
然后解方程:f(x)=21−1−4g(x)f(x)=\frac 2{1-\sqrt{1-4g(x)}}f(x)=114g(x)2
然后上多项式开方和多项式求逆即可。

悲伤的故事:封装了一波多项式运算导致常数太大,于是只能在codeforcescodeforcescodeforces上水过,bzojbzojbzoj至今未过
代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){int ans=0;char ch=getchar();while(!isdigit(ch))ch=getchar();while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();return ans;
}
typedef long long ll;
const int mod=998244353;
int n,lim,tim,m;
vector<int>A,B,pos,Inv;
#define add(a,b) ((a)+(b)>=mod?(a)+(b)-mod:(a)+(b))
#define dec(a,b) ((a)>=(b)?(a)-(b):(a)-(b)+mod)
#define mul(a,b) ((ll)(a)*(b)%mod)
inline int ksm(int a,int p){int ret=1;for(;p;p>>=1,a=mul(a,a))if(p&1)ret=mul(ret,a);return ret;}
inline void ntt(vector<int>&a,const int&type){for(ri i=0;i<lim;++i)if(i<pos[i])swap(a[i],a[pos[i]]);for(ri mid=1,wn,mult=(mod-1)/2,typ=type==1?3:(mod+1)/3;mid<lim;mid<<=1,mult>>=1){wn=ksm(typ,mult);for(ri j=0,len=mid<<1;j<lim;j+=len)for(ri w=1,a0,a1,k=0;k<mid;++k,w=mul(w,wn)){a0=a[j+k],a1=mul(w,a[j+k+mid]);a[j+k]=add(a0,a1),a[j+k+mid]=dec(a0,a1);}}if(type==-1)for(ri i=0,inv=ksm(lim,mod-2);i<lim;++i)a[i]=mul(a[i],inv);
}
inline void init(const int&up){lim=1,tim=0;while(lim<=up)lim<<=1,++tim;pos.resize(lim),pos[0]=0;for(ri i=0;i<lim;++i)pos[i]=(pos[i>>1]>>1)|((i&1)<<(tim-1));
}
struct poly{vector<int>a;inline int deg()const{return a.size()-1;}poly(int k,int x=0){a.resize(k+1),a[k]=x;}inline int&operator[](const int&k){return a[k];}inline const int&operator[](const int&k)const{return a[k];}inline poly extend(const int&k){poly ret=*this;return ret.a.resize(k),ret;}friend inline poly operator+(const poly&a,const poly&b){poly ret(max(a.deg(),b.deg()));for(ri i=0;i<=a.deg();++i)ret[i]=add(ret[i],a[i]);for(ri i=0;i<=b.deg();++i)ret[i]=add(ret[i],b[i]);return ret;}friend inline poly operator-(const poly&a,const poly&b){poly ret(max(a.deg(),b.deg()));for(ri i=0;i<=a.deg();++i)ret[i]=add(ret[i],a[i]);for(ri i=0;i<=b.deg();++i)ret[i]=dec(ret[i],b[i]);return ret;}friend inline poly operator*(const int&a,const poly&b){poly ret(b.deg());for(ri i=0;i<=b.deg();++i)ret[i]=mul(a,b[i]);return ret;}friend inline poly operator*(const poly&a,const poly&b){int n=a.deg(),m=b.deg();init(n+m),A.resize(lim),B.resize(lim);poly ret(lim-1);for(ri i=0;i<=n;++i)A[i]=a[i];for(ri i=0;i<=m;++i)B[i]=b[i];for(ri i=n+1;i<lim;++i)A[i]=0;for(ri i=m+1;i<lim;++i)B[i]=0;ntt(A,1),ntt(B,1);for(ri i=0;i<lim;++i)A[i]=mul(A[i],B[i]);return ntt(A,-1),ret.a=A,ret;}inline poly poly_inv(poly a,const int&k){a=a.extend(k);if(k==1)return poly(0,ksm(a[0],mod-2));poly f0=poly_inv(a,(k+1)>>1);return (2*f0-((f0*f0.extend(k))*a).extend(k)).extend(k);}inline poly poly_sqrt(poly a,const int&k){a=a.extend(k);if(k==1)return poly(0,1);poly f0=poly_sqrt(a,(k+1)>>1).extend(k);return (((f0*f0).extend(k)+a)*poly_inv((2*f0),k)).extend(k);}
};
int main(){n=read(),m=read();int len;for(len=1;len<=m;len<<=1);poly sqr=(len);for(ri i=1,v;i<=n;++i){v=read();if(v<=m)sqr[v]=mod-4;}++sqr[0],sqr=sqr.poly_sqrt(sqr,len),++sqr[0],sqr=sqr.poly_inv(sqr,len);for(ri i=1;i<=m;++i)cout<<mul(sqr[i],2)<<'\n';return 0;
}

转载于:https://www.cnblogs.com/ldxcaicai/p/10367793.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 全局变量

报错信息&#xff1a;UnboundLocalError: local variable referenced before assignment 在函数内部修改全局变量时报错。 因为&#xff1a;在python里&#xff0c;如果在函数内部试图去修改一个全局变量&#xff0c;那么实际上的操作是 Python会创建一个新的名字一模一样的局部…

斑能不能彻底去掉_用茶树精油祛痘时,千万不能做这5件事!!!

祛痘注意事项~用茶树精油祛痘时&#xff0c;千万不能做这5件事&#xff01;&#xff01;&#xff01;长痘痘虽然是令人很头疼的事&#xff0c;但是茶树精油祛痘、去痘印功效可谓是无敌的&#xff01;茶树精油是自然界中的抗菌大师&#xff0c;能净化皮肤、平衡皮肤油脂分泌&…

JAX-RS 2.0:自定义内容处理

我试图想到一个更好的标题&#xff0c;但未能拿出一个&#xff01; 请多多包涵……。 JAX-RS 2.0规范允许我们无缝地将JAXB对象编组到HTTP请求/响应主体/从HTTP请求/响应主体中解组。 简而言之&#xff0c;我们可以使用域对象&#xff0c;而不必担心基于JAX-RS的解决方案中的低…

这个夏天,感动我的歌,感动我的你

七里香 词&#xff1a;方文山 曲&#xff1a;周杰伦 JAY 窗外的麻雀 在电线杆上多嘴你说这一句 很有夏天的感觉手中的铅笔 在纸上来来回回我用几行字形容你是我的谁 秋刀鱼的滋味 猫跟你都想了解初恋的香味就这样被我们寻回那温暖的阳光 像刚摘的鲜艳草莓你说你…

构造函数模式

function student(props){this.nameprops.name || 匿名;//默认是匿名this.gradeprops.grade || 1;}student.prototype.hellofunction(){console.log(hello this.name);}function createStudent(props){return new student(props||{})}var xiaomingcreateStudent({name:xiaomin…

android 获取应用内存大小,如何在Android中获取当前内存使用量?

这取决于您要获得的内存查询的定义。通常&#xff0c;您想知道堆内存的状态&#xff0c;因为如果它占用了太多内存&#xff0c;您就会得到OOM并使应用程序崩溃。为此&#xff0c;您可以检查下一个值&#xff1a;final Runtime runtime Runtime.getRuntime();final long usedMe…

Waymo在美国推出自动驾驶汽车共享服务

导读经过数月的测试和数百万英里的无人驾驶汽车技术开发&#xff0c;Waymo 正式在美国推出了具有商业性质的自动驾驶汽车的共享服务。该公司的 Waymo One 项目将为客户提供 24 小时自动驾驶汽车服务。最初&#xff0c;这项服务将仅限于菲尼克斯周边城市&#xff0c;包括坦佩 (T…

2019春第一次课程设计实验报告

一、实验项目名称&#xff1a; 飞机游戏简化的编写 二、实验项目功能描述&#xff1a; 这个实验主要是实现游戏的正常运行&#xff0c;实现控制飞机的移动功能&#xff0c;增加其实用度&#xff0c; 同时还实现发射子弹和出现敌机的操作&#xff0c;利用函数封装重构飞机游戏&a…

区别和联系_动机与主题的区别与联系

今天我算是彻底弄明白了动机与主题的区别与联系&#xff08;暴论&#xff09;。当前些天我开始尝试写简单的奏鸣曲时&#xff0c;主题是什么&#xff0c;这个问题卡住了我&#xff0c;因为之前写的练习曲都是基于简单动机的。所以我求助于维基百科。主题是什么&#xff1f;参考…

Java 8中的新BigInteger方法

对JDK 8中的新功能的关注理所当然地主要集中在新的语言功能和语法上。 但是&#xff0c;对库和API进行了一些不错的添加&#xff0c;在本文中&#xff0c;我介绍了BigInteger类中添加的四个新方法&#xff1a; longValueExact&#xff08;&#xff09; &#xff0c; intValueEx…

巴顿又吃回头草

巴顿是一名好车手&#xff0c;一个会给shumi以及kimi造成威胁的家伙&#xff0c;我并不在意他在哪个车队&#xff0c;只希望他跑得比kimi慢才好。from新浪&#xff1a;宛如平地一声雷&#xff0c;巴顿重返威廉姆斯的消息不仅让车迷感到错愕&#xff0c;英美车队的老板理查兹更是…

打印发现function toUpperCase() { [native code] }

var shello undefined s.toUpperCase function toUpperCase() { [native code] } s.toUpperCase() "HELLO" 咦 然后我就发现了 要是这本来是一个方法 然后你没有用一个方法的方式去调用&#xff0c;就会出现function toUpperCase() { [native code] } 类似于这一句 …

android 静态方法 构造方法,android基础-Java篇02:类和对象、构造方法、访问权限控制、重载、this关键字、static关键字...

一、类和构造方法(类和对象在百度百科已经有详细的介绍&#xff0c;这里只做简单的描述以及帮助理解&#xff1b;百度百科&#xff1a;类和对象&#xff0c;需要注意的是&#xff0c;百度百科类和对象的举例中都是C&#xff0c;书写格式不要和Java混淆&#xff01;)什么是类&am…

『003』Shell命令

『001』索引-Linux Shell Command shell命令 《01》【线上查询及帮助】【001】-【001】 【001】- 点我快速打开文章【man】【help】【已改版】《02》【文件及目录操作】【002】-【008】 【002】- 点我快速打开文章【ls】【cd】【已改版】【003】- 点我快速打开文章【cp】【find…

尝试将WCF映射到Java术语

通过写这篇文章&#xff0c;我冒着被.NET和Java社区拒绝的巨大风险。 试图解释Java术语WCF &#xff08;代表Windows Communication Foundation&#xff09;是什么。 从WCF到Java的映射并不是很简单。 我缺乏对WFC使用者应该了解的与服务通信类型的了解&#xff1a;请求/响应或…

bootbox.js

bootbox:一个弹出框插件&#xff0c;官网看一下例子就好了&#xff1a;http://bootboxjs.com/examples.html 目前来说应该只要调用bootbox.js就可以了&#xff0c;没有css的问题 1.有最基本的调用就是 bootbox.alert("This is the default alert!"); 就什么都不做&…

android fragment界面滑动切换效果,Android App中使用ViewPager+Fragment实现滑动切换效果...

在android应用中&#xff0c;多屏滑动是一种很常见的风格&#xff0c;没有采用viewpager的代码实现会很长&#xff0c;如果采用ViewPager&#xff0c;代码就会短很多&#xff0c;但是使用ViewPager也有弊端&#xff1a;需要导入android-support-v4.jar、细节无法控制。不过现在…

相对路径./与../区别

一、基本概念 1、相对路径-顾名思义&#xff0c;相对路径就是相对于当前文件的路径。网页中一般表示路径使用这个方法。 2、绝对路径-绝对路径就是你的主页上的文件或目录在硬盘上真正的路径。绝对路径就是你的主页上的文件或目录在硬盘上真正的路径&#xff0c;比如&#xff0…

nodejs进程异常退出处理方法

1. 捕获uncaughtException process.on(uncaughtException, function (err) {//打印出错误console.log(err);//打印出错误的调用栈方便调试console.log(err.stack)&#xff1b; }); 2. 使用守护进程 例如&#xff1a;node-forever的守护和日志记录功能 安装非常容易 [sudo] npm …

关于Java的常见误解

Java是世界上使用最广泛的语言&#xff08;需要引用&#xff09;&#xff0c;每个人对此都有自己的见解。 由于它是主流&#xff0c;所以通常会嘲笑它&#xff0c;有时是正确的&#xff0c;但有时批评只是不切合实际。 我将尝试解释我最喜欢的5个关于Java的误解。 Java速度很慢…