[xsy2363]树

设$f_{i,j}$表示$i$个点的树,权值为$j$且可以不选根的方案数,$g_{i,j}$表示$i$个点的树,权值为$j$且必选根的方案数
首先$g_{1,1}=0$
我们可以把原树连上一个新的子树,转移有四种情况,其中黑点表示原来在最大独立集中的点

$\begin{align*}g_{i,j}&\leftarrow\sum\limits_{a=1}^{i-1}\sum\limits_{b=1}^{j-1}g_{i-a,j-b}f_{a,b}\\f_{i,j}&\leftarrow\sum\limits_{a=1}^{i-1}\sum\limits_{b=1}^{j-1}f_{i-a,j-b}g_{a,b}\\f_{i,j}&\leftarrow\sum\limits_{a=1}^{i-1}\sum\limits_{b=1}^{j-1}f_{i-a,j-b}f_{a,b}\\f_{i,j-1}&\leftarrow\sum\limits_{a=1}^{i-1}\sum\limits_{b=1}^{j-1}g_{i-a,j-b}g_{a,b}\end{align*}$
最后一条是因为两个原来在最大独立集中的点相邻,我们要削除一个点
注意到转移是卷积的形式,设$G_{i}(x)$为$g_{i,1\cdots n}$的生成函数,$F_i(x)$为$f_{i,1\cdots n}$的生成函数,我们有$\begin{align*}G_i(x)=\sum\limits_{a=1}^{i-1}G_{i-a}(x)F_a(x),F_i(x)=\sum\limits_{a=1}^{i-1}F_{i-a}(x)F_a(x)+F_{i-a}(x)G_a(x)+\dfrac{G_{i-a}(x)G_a(x)}x\end{align*}$
可以直接对$f_{1,1\cdots n}$和$g_{1,1\cdots n}$DFT后用点值计算$G_{2\cdots n}$和$F_{2\cdots n}$,最后再IDFT回来
这题是不是可以暴力DFT啊23333
#include<stdio.h>
typedef long long ll;
const int mod=998244353;
ll mul(ll a,ll b){return a*b%mod;}
ll ad(ll a,ll b){return(a+b)%mod;}
ll de(ll a,ll b){return(a-b)%mod;}
ll pow(ll a,ll b){
ll s=1;
while(b){
if(b&1)s=mul(s,a);
a=mul(a,a);
b>>=1;
}
return s;
}
int rev[512],N,iN;
void pre(int n){
int i,k;
for(N=1,k=0;N<n;N<<=1)k++;
for(i=0;i<N;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1));
iN=pow(N,mod-2);
}
void swap(ll&a,ll&b){a^=b^=a^=b;}
void ntt(ll*a,int on){
int i,j,k,t,w,wn;
for(i=0;i<N;i++){
if(i<rev[i])swap(a[i],a[rev[i]]);
}
for(i=2;i<=N;i<<=1){
wn=pow(3,(on==1)?(mod-1)/i:(mod-1-(mod-1)/i));
for(j=0;j<N;j+=i){
w=1;
for(k=0;k<i>>1;k++){
t=mul(w,a[i/2+j+k]);
a[i/2+j+k]=de(a[j+k],t);
a[j+k]=ad(a[j+k],t);
w=mul(w,wn);
}
}
}
if(on==-1){
for(i=0;i<N;i++)a[i]=mul(a[i],iN);
}
}
ll f[510][512],g[510][512],inv[512];
int main(){
int n,i,j,k;
scanf("%d",&n);
pre(n);
j=pow(3,mod-1-(mod-1)/N);
k=1;
for(i=0;i<N;i++){
inv[i]=k;
k=mul(j,k);
}
g[1][1]=1;
ntt(f[1],1);
ntt(g[1],1);
for(i=2;i<=n;i++){
for(j=1;j<i;j++){
for(k=0;k<N;k++){
f[i][k]=(f[i][k]+f[i-j][k]*f[j][k]+f[i-j][k]*g[j][k]+mul(g[i-j][k],g[j][k])*inv[k])%mod;
g[i][k]=(g[i][k]+g[i-j][k]*f[j][k])%mod;
}
}
}
for(i=1;i<=n;i++){
for(j=0;j<N;j++)f[i][j]=ad(f[i][j],g[i][j]);
ntt(f[i],-1);
for(j=0;j<=n;j++)printf("%lld ",(f[i][j]+mod)%mod);
putchar('\n');
}
}
[xsy2363]树的更多相关文章
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单
前言: 前面几篇重点都在讲普通列表的相关操作. 本篇主要讲树型列表的操作. 框架在设计时,已经把树型列表和普通列表全面统一了操作,用法几乎是一致的. 下面介绍一些差距化的内容: 1:树型列表绑定: v ...
- 再讲IQueryable<T>,揭开表达式树的神秘面纱
接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...
- HDU1671——前缀树的一点感触
题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceed ...
- 算法与数据结构(十一) 平衡二叉树(AVL树)
今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...
- [C#] C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- bzoj3207--Hash+主席树
题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...
- bzoj1901--树状数组套主席树
树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
随机推荐
- cookie 是存储于访问者的计算机中的变量
今天把javascript如何用来创建及存储cookie复习了一下,其中的一点体会拿出来和大家讨论,首先看一下基础知识: 什么是cookie cookie 是存储于访问者的计算机中的变量.每当同一台计 ...
- ssh中的相对路径与绝对路径的问题
一:前言:自己在学习ssh的时候常常被路径给迷惑,就比如在刚刚学习jsp的servlet时,绝对路径和相对路径我就弄混了,所以专门写了一篇博客来记载.而现在自己是在学ssh的时候在此遇到路径问题,本来 ...
- HDU 1395
2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- 数学:Lucas定理
利用Lucas定理解决大组合数取模 Lucas定理是用来求 C(n,m) mod p,p为素数的值.(注意:p一定是素数) Lucas定理用来解决大组合数求模是很有用的 Lucas定理最大的数据处理能 ...
- EL遍历集合
jstl EL表达式遍历集合 博客分类: JSTL/EL JSTLEL遍历集合 在EL中,方括号运算符用来检索数组和集合的元素.对于实现 java.util.Map 接口的集合,方括号运算符使用关联 ...
- AtCoder Regular Contest 075 D Widespread
题目传送门 这道题其实二分一下答案就okay了的 不过LL什么的有时候忘了加 被卡了下 #include<cstdio> #include<cstring> #include& ...
- linux软件管理(Vim编辑器使用) ——(七)
windows : .exe 安装 .卸载 安装: mysql.exe cc.exe 卸载 : 该软件唯一的标识 ,包名 alibaba android : *.apk 卸载 包 ...
- Python 模拟SQL对文件进行增删改查
#!/usr/bin/env python # _*_ coding:UTF-8 _*_ # __auth__: Dalhhin # Python 3.5.2,Pycharm 2016.3.2 # 2 ...
- go的websocket实现
websocket分为握手和数据传输阶段,即进行了HTTP握手 + 双工的TCP连接 RFC协议文档在:http://tools.ietf.org/html/rfc6455 握手阶段 握手阶段就是普通 ...
- mysql分页查询语法
一.limit语法 SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 SELECT 语句返回指 ...