题意:有一个集合,求有多少形态不同的二叉树满足每个点的权值都属于这个集合并且总点权等于i

题解:先用生成函数搞出来\(f(x)=f(x)^2*c(x)+1\)

然后转化一下变成\(f(x)=\frac{2}{1+\sqrt{1-4*c(x)}}\)

然后多项式开根和多项式求逆即可(先对下面的项开根,然后再求逆)

多项式开根:

\(B(x)^2=A(x) \bmod x^{ \lfloor \frac{n}{2} \rfloor}\)

\(B'(x)^2=A(x) \bmod x^{ \lfloor \frac{n}{2} \rfloor}\)

\(B(x)^2-B'(x)^2\equiv 0\),\((B(x)+B'(x))*(B(x)-B'(x))\equiv 0\),取\(B(x)=B'(x)\)

\(B(x)^2-2*B(x)*B'(x)+B'(x)^2\equiv0\),

\(B(x)\equiv \frac{A(x)+B'(x)^2}{2*B'(x)}\)

//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize(4)
//#pragma GCC optimize("unroll-loops")
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<bits/stdc++.h>
#define fi first
#define se second
#define db double
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 998244353
#define ld long double
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
//#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define fin freopen("a.txt","r",stdin)
#define fout freopen("a.txt","w",stdout)
#define fio ios::sync_with_stdio(false);cin.tie(0)
template<typename T>
inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
template<typename T>
inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;} using namespace std; const double eps=1e-8;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int N=100000+10,maxn=400000+10,inf=0x3f3f3f3f; ll a[N<<3],b[N<<3],c[N<<3],d[N<<3],tmp[N<<3],inv2=qp(2,mod-2);
int rev[N<<3];
void getrev(int bit)
{
for(int i=0;i<(1<<bit);i++)
rev[i]=(rev[i>>1]>>1) | ((i&1)<<(bit-1));
}
void ntt(ll *a,int n,int dft)
{
for(int i=0;i<n;i++)
if(i<rev[i])
swap(a[i],a[rev[i]]);
for(int step=1;step<n;step<<=1)
{
ll wn=qp(3,(mod-1)/(step*2));
if(dft==-1)wn=qp(wn,mod-2);
for(int j=0;j<n;j+=step<<1)
{
ll wnk=1;
for(int k=j;k<j+step;k++)
{
ll x=a[k];
ll y=wnk*a[k+step]%mod;
a[k]=(x+y)%mod;a[k+step]=(x-y+mod)%mod;
wnk=wnk*wn%mod;
}
}
}
if(dft==-1)
{
ll inv=qp(n,mod-2);
for(int i=0;i<n;i++)a[i]=a[i]*inv%mod;
}
}
void pol_inv(int deg,ll *a,ll *b)
{
if(deg==1){b[0]=qp(a[0],mod-2);return ;}
pol_inv((deg+1)>>1,a,b);
int sz=0;while((1<<sz)<=deg)sz++;
getrev(sz);int len=1<<sz;
for(int i=0;i<deg;i++)tmp[i]=a[i];
for(int i=deg;i<len;i++)tmp[i]=0;
ntt(tmp,len,1),ntt(b,len,1);
for(int i=0;i<len;i++)
b[i]=(2ll-tmp[i]*b[i]%mod+mod)%mod*b[i]%mod;
ntt(b,len,-1);
for(int i=deg;i<len;i++)b[i]=0;
}
void pol_sqrt(int deg,ll *a,ll *b)
{
if(deg==1){b[0]=1;return ;}
pol_sqrt((deg+1)>>1,a,b);
int sz=0;while((1<<sz)<=deg)sz++;
getrev(sz);int len=1<<sz;
for(int i=0;i<len;i++)d[i]=0;
pol_inv(deg,b,d);
for(int i=0;i<deg;i++)tmp[i]=a[i];
for(int i=deg;i<len;i++)tmp[i]=0;
ntt(tmp,len,1),ntt(b,len,1),ntt(d,len,1);
for(int i=0;i<len;i++)
b[i]=(tmp[i]*d[i]%mod+b[i])%mod*inv2%mod;
ntt(b,len,-1);
for(int i=deg;i<len;i++)b[i]=0;
}
int main()
{
int n,m;scanf("%d%d",&n,&m);
for(int i=0,x;i<n;i++)
{
scanf("%d",&x);
a[x]=mod-4;
}
a[0]=1;
int len=1;while(len<=m)len<<=1;
pol_sqrt(len,a,b);
++b[0];
pol_inv(len,b,c);
for(int i=1;i<=m;i++)printf("%lld\n",c[i]*2%mod);
return 0;
}
/******************** ********************/

最新文章

  1. 配置Spark on YARN集群内存
  2. js 检测页面刷新或关闭
  3. 基于MVC4+EasyUI的Web开发框架经验总结(15)--在MVC项目中使用RDLC报表
  4. Tomcat 6 --- 使用Jasper引擎解析JSP
  5. unity 解析tmx 2
  6. solr集成mmseg4j分词
  7. C# 文件读取(一)
  8. IOS之分析网易新闻存储数据(CoreData的使用,增删改查)
  9. 《Java程序设计》第三周学习总结
  10. ajax和servlet交互
  11. MyBatis的动态SQL操作--插入
  12. armv8(aarch64)linux内核中flush_dcache_all函数详细分析
  13. 【ecos学习4】[转]ubuntu 11.04 tftp 设置
  14. angular指令中,require和transclude同时设置为true时的作用
  15. Mysql 5.6到5.7的mysql.user改变
  16. jsp内置对象-session对象
  17. 「Manacher算法」学习笔记
  18. supervisord的安装使用
  19. Nginx 负载均衡4种模式
  20. JavascriptDom编程艺术(笔记)

热门文章

  1. C语言 字符串大小写转换 自定义函数
  2. 说明Heap与stack的差别。
  3. Kibana——日志可视化工具
  4. POJ 2718 Smallest Difference(最小差)
  5. JS 事件绑定、事件监听、事件委托详细介绍
  6. 在服务器端对sshd做白名单
  7. linux 校准时间方法
  8. Python day2_int以及string的常见方法1_笔记
  9. Qt5获取本机网络信息
  10. linux下源码安装