BZOJ3625 CF438E 小朋友与二叉树
心态崩了 不放传送门了 辣鸡bz
还是正经一点写一下题解= =
就是显然我们可以把权值写成生成函数形式g(0/1序列)来表示权值是否出现
然后f来表示总的方案数
可以列出 分别枚举左右子树和空树的情况
然后解方程得到
显然开根开出来常数项是1 而g不带常数项 那么就必须取-才能保证除法有效
然后为了计算方便我们把柿子写成(平方差上下同乘)
然后就是多项式开根和多项式求逆了
多项式求逆可以戳我的【学习笔记】
然后开根是类似的 也是通过倍增 可以得到递归求解就好了
这个最可怕的是所以是随便套 就非常恐怖了(囧
然后我就发现我的写法写多项式开根非常麻烦 然后就开始胡乱改
常数上天 BZT飞
本来写的心态就很不好 懒得改了= =
所以这份代码BZ是会T掉的 小心食用qwq
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
#define inf 20021225
#define wph 998244353
#define G 3
#define mxn 1600010
#define inv2 499122177
#define int ll
using namespace std;
int rev[mxn],inv;
int ksm(int bs,int mi)
{
int ans=1;
while(mi)
{
if(mi&1) ans=(ll)ans*bs%wph;
bs=(ll)bs*bs%wph; mi>>=1;
}
return ans;
}
int init(int n)
{
int lim=1,l=0;
while(lim<n) lim<<=1,l++;
for(int i=0;i<lim;i++)
rev[i] = (rev[i>>1]>>1)|((i&1)<<(l-1));
inv = ksm(lim,wph-2);
return lim;
}
void ntt(int *a,int n,int f)
{
for(int i=0;i<n;i++)
if(rev[i]>i) swap(a[i],a[rev[i]]);
for(int k=2;k<=n;k<<=1)
{
int Wn=ksm(G,(wph-1)/k),mid=k>>1;
if(f) Wn=ksm(Wn,wph-2);
for(int w=1,i=0;i<n;i+=k,w=1)
{
for(int j=0;j<mid;j++,w=(ll)w*Wn%wph)
{
int x=a[i+j],y=(ll)w*a[i+j+mid]%wph;
a[i+j]=(x+y)%wph;a[i+j+mid]=(x-y+wph)%wph;
}
}
}
if(f) for(int i=0;i<n;i++) a[i]=(ll)a[i]*inv%wph;
}
int f[mxn],g[mxn],h[mxn];
void poly_inv(int *a,int n)
{
if(n==1)
{
g[0] = ksm(a[0],wph-2);
return;
}
int mid = (n+1)>>1;
poly_inv(a,mid);
int lim = init(n<<1);
for(int i=0;i<n;i++) h[i]=a[i];
for(int i=n;i<lim;i++) h[i]=0;
ntt(h,lim,0); ntt(g,lim,0);
for(int i=0;i<lim;i++)
g[i] = (2ll - (ll)h[i]*g[i]%wph + wph)%wph *g[i] %wph;
ntt(g,lim,1);
for(int i=n;i<lim;i++) g[i]=0;
}
int d[mxn],t[mxn];
void poly_sqrt(int a[],int n)
{
//printf("%d\n",n);
if(n==1){d[0] = 1;return;}
int mid = n>>1; poly_sqrt(a,mid);
int lim = init(n);// while(lim<(n<<1)) lim<<=1;
memset(g,0ll,sizeof(ll)*n*2);
poly_inv(d,n);
for(int i=0;i<n;i++) h[i]=a[i];
for(int i=n;i<lim*2;i++) h[i]=0;
lim = init(n<<1);
ntt(h,lim,0); ntt(g,lim,0); ntt(d,lim,0);
for(int i=0;i<lim;i++)
d[i] = ((ll)h[i]*g[i]%wph + d[i])%wph *inv2%wph;
ntt(d,lim,1);
for(int i=n;i<lim;i++) d[i]=0;
}
int a[mxn];
signed main()
{
int n,m,x;
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%lld",&x);
if(x<=m) f[x] = wph - 4;
}
f[0]=1;
int lim=init(m<<1);
poly_sqrt(f,lim);
d[0]++;
//for(int i=0;i<(m<<1);i++) printf("%d ",d[i]);
memset(g,0,sizeof(g));
lim = init(m<<1);
poly_inv(d,lim);// printf("%d ",g[0]*2%wph);
for(int i=1;i<=m;i++) printf("%lld\n",g[i]*2%wph);
/**scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&f[i]);
poly_inv(f,n);
for(int i=0;i<n;i++) printf("%d ",g[i]);*/
return 0;
}
/**
*/
BZOJ3625 CF438E 小朋友与二叉树的更多相关文章
- [BZOJ3625][CF438E]小朋友和二叉树
题面 Description 我们的小朋友很喜欢计算机科学,而且尤其喜欢二叉树. 考虑一个含有\(n\)个互异正整数的序列\(c_1,c_2,\ldots,c_n\).如果一棵带点权的有根二叉树满足其 ...
- [BZOJ3625][CF438E]小朋友和二叉树 (多项式开根,求逆)
题面 题解 设多项式的第a项为权值和为a的二叉树个数,多项式的第a项表示是否为真,即 则,所以F是三个多项式的卷积,其中包括自己: ,1是F的常数项,即. 我们发现这是一个一元二次方程,可以求出,因为 ...
- [CF438E] 小朋友和二叉树
Description 给定一个整数集合 \(c\),对于每个 \(i\in[1,m]\),求有多少种不同的带点权的二叉树使得这棵树点权和为 \(i\) 并且顶点的点权全部在集合 \(c\) 中.\( ...
- 【bzoj3625】【xsy1729】小朋友和二叉树
[bzoj3625]小朋友与二叉树 题意 我们的小朋友很喜欢计算机科学,而且尤其喜欢二叉树. 考虑一个含有n个互异正整数的序列c[1],c[2],...,c[n].如果一棵带点权的有根二叉树满足其所有 ...
- 【BZOJ3625/CF438E】小朋友和二叉树(多项式求逆,多项式开方)
[BZOJ3625/CF438E]小朋友和二叉树(多项式求逆,多项式开方) 题面 BZOJ CodeForces 大致题意: 对于每个数出现的次数对应的多项式\(A(x)\) 求\[f(x)=\fra ...
- 【CF438E】小朋友和二叉树 解题报告
[CF438E]小朋友和二叉树 Description 我们的小朋友很喜欢计算机科学,而且尤其喜欢二叉树. 考虑一个含有\(n\)个互异正整数的序列\(c_1,c_2,\dots,c_n\). ...
- BZOJ 3625: [Codeforces Round #250]小朋友和二叉树
3625: [Codeforces Round #250]小朋友和二叉树 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 304 Solved: 13 ...
- 「BZOJ 3645」小朋友与二叉树
「BZOJ 3645」小朋友与二叉树 解题思路 令 \(G(x)\) 为关于可选大小集合的生成函数,即 \[ G(x)=\sum[i\in c ] x^i \] 令 \(F(x)\) 第 \(n\) ...
- [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)
[BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...
随机推荐
- 批量搞机(二):分布式ELK平台、Elasticsearch介绍、Elasticsearch集群安装、ES 插件的安装与使用
一.分布式ELK平台 ELK的介绍: ELK 是什么? Sina.饿了么.携程.华为.美团.freewheel.畅捷通 .新浪微博.大讲台.魅族.IBM...... 这些公司都在使用 ELK!ELK! ...
- 20180708-Java变量类型
public class Test{ public void pupAge(){ int age = 0; age = age + 7; System.out.println("Puppy ...
- 2019 年百度之星·程序设计大赛 - 复赛 Diversity (树形DP)
题目:https://vjudge.net/contest/325352#problem/A 题意:给你一棵树,每个点给一个区间,可以选区间里面任何一个数,然后问怎么安排得到最大边两点之间的差值和,求 ...
- 31 October
https://www.cnblogs.com/RabbitHu/p/51nod1353.html 树形 DP 求所有联通块 \(\ge K\) 的方案数. 切断:\(\forall i\in\lef ...
- matplot在Mac下显示中文的方案
使用matplotlib经常会出现中文显示异常的问题. 网上很多都讲需要下载中文字体包...偶然看到别人发的一种简单的解决放啊.Mac上本身就有支持中文的字体包啊.引入就好了 贴上代码 plt.rcP ...
- How to resolve error “Failed to resolve: org.jetbrains.kotlin:kotlin-stdlib-jre7…” when building in Android Studio Ask Question
//implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" implementation & ...
- vs报错 "多步操作产生错误。请检查每一步的状态值"
今天在开发一个插件图表控件,在实例化后向数据库Update时候,报出此错误,刚开始以为是我用的异步方法,在调用程序的句柄的时候的线程问题,索性改成了同步方法,仍然报出此错误.后来Debug和排错,定位 ...
- reuseaddr和点对点聊天
解决绑定失败 在测试时,经常会出现绑定错误,bind error: Address already in use 这里只要指定一下socket的reuseaddr属性即可解决 int on=1; if ...
- [Linux] 017 网络命令与挂载命令
1. 网络命令:write 命令名称:write 命令所在路径:/usr/bin/write 执行权限:所有用户 语法:write [用户名] 功能描述:给用户发信息,以 Ctrl-d 保存结束 范例 ...
- Eclipse常见版本和JDK常用版本对应关系
Luna 4.4 JDK1.6Mars 4.5 JDK1.7 Neon 4.6 JDK1.8Oxygen 4.7 JDK1.8Photon 4.8 2019年3月