题面

有n个点,它们从1到n进行标号,第i个点的限制为度数不能超过A[i].

现在对于每个s (1 <= s <= n),问从这n个点中选出一些点组成大小为s的有标号无根树的方案数。

100%的数据:n <= 100

100

prufer序列

每个大小为n,有标号无根树都可以表示成一个长度为(n-2)且取值在[1,n]的序列。

这个序列就叫prufer序列

树转prufer序列

1.每次查找一个标号最小且度数为一的点,使与之相连的点的编号加入序列尾;

2.删除树中的这个点。

prufer序列转树

1.新建一个包含[1,n]的集合;

2.找出集合中在序列中未出现的最小编号,并使之与序列头连一条边;

3.删除集合中的这个编号,以及序列头;

4.重复2-3步骤n-2次,序列则为空;

5.把集合中的剩余两个编号相连,原树复原。

性质

1.长度为(n-2)的prufer序列的集合与大小为n的带标号无根树的集合一一映射。

2.带标号无根树的任意点的度数等于,与之对应的prufer序列的对应编号出现次数+1。


Back to Problem

Pre

假设我们求出了一个prufer序列的长度\(n\),并且知道其中每个编号出现的次数\(c_i\)。

由性质2,那么这种prufer序列的贡献就是,它的不同全排列数,有:

\[Ans=n!*\sum_{i=1}^n\frac{1}{c_i!}
\]

正文

所以我们把原题转化为在序列上的动态规划

设\(f_{i,j,k}\)表示前i个点,用了j个点,序列长度为k的方案数。

那么就有,

\[f_{i,j,k} \Rightarrow \begin{cases}
f_{i+1,j,k}\\
f_{i+1,j+1,k+l},&l \in [0,a_i-1]
\end{cases}
\]

最终答案就是\(f_{n,s,s-2}*(s-2)!\)。

时间复杂度为\(O(n^4)\),但由于冗余状态的存在,是能卡过的。

原题是要用FFT优化到\(O(n^3*log_n)\)

Code

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define ll long long
#define fo(i,x,y) for(int i=x;i<=y;i++)
#define fd(i,x,y) for(int i=x;i>=y;i--)
using namespace std;
const char* fin="tree.in";
const char* fout="tree.out";
const int inf=0x7fffffff;
const int maxn=107,mo=1004535809;
int n,a[maxn],f[maxn][maxn][maxn],fact[maxn],nf[maxn];
int qpower(int a,int b){
int c=1;
while (b){
if (b&1) c=1LL*a*c%mo;
a=1LL*a*a%mo;
b>>=1;
}
return c;
}
int ni(int v){return qpower(v,mo-2);}
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%d",&n);
fact[0]=1;
fo(i,1,maxn-1) fact[i]=1LL*fact[i-1]*i%mo;
fo(i,0,maxn-1) nf[i]=ni(fact[i]);
fo(i,1,n) scanf("%d",&a[i]);
memset(f,0,sizeof f);
f[1][0][0]=1;
fo(i,1,n)
fo(j,0,i-1)
fo(k,0,n){
f[i+1][j][k]=(f[i][j][k]+f[i+1][j][k])%mo;
fo(l,0,a[i]-1){
if (k+l>n) break;
f[i+1][j+1][k+l]=(f[i+1][j+1][k+l]+1LL*f[i][j][k]*nf[l])%mo;
}
}
printf("%d ",n);
fo(i,2,n) cout<<1LL*f[n+1][i][i-2]*fact[i-2]%mo<<" ";
return 0;
}

【JZOJ5068】【GDSOI2017第二轮模拟】树 动态规划+prufer序列的更多相关文章

  1. 【JZOJ5071】【GDSOI2017第二轮模拟】奶酪 树形dp

    题面 CJY很喜欢吃奶酪,于是YJC弄到了一些奶酪,现在YJC决定和CJY分享奶酪. YJC弄到了n-1块奶酪,于是他把奶酪挂在了一棵n个结点的树上,每根树枝上挂一块奶酪,每块奶酪都有重量. YJC和 ...

  2. 【JZOJ5060】【GDOI2017第二轮模拟day1】公路建设 线段树+最小生成树

    题面 在Byteland一共有n 个城市,编号依次为1 到n,它们之间计划修建m条双向道路,其中修建第i 条道路的费用为ci. Byteasar作为Byteland 公路建设项目的总工程师,他决定选定 ...

  3. [jzoj5073 GDOI2017第二轮模拟] 影魔

    Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵 ...

  4. 【JZOJ5064】【GDOI2017第二轮模拟day2】友好城市 Kosarajo算法+bitset+ST表+分块

    题面 在Byteland 一共有n 座城市,编号依次为1 到n,这些城市之间通过m 条单向公路连接. 对于两座不同的城市a 和b,如果a 能通过这些单向道路直接或间接到达b,且b 也能如此到达a,那么 ...

  5. GDOI2017第二轮模拟day1 总结

    平民比赛 这场比赛的暴力分非常友好. 但是我并没有拿到全部的暴力分. 1(暴力分\(60/100\)) 暂时我可以拿的暴力分为\(30/100\),直接mst模拟即可. 然而当时打了个辣鸡莫队,结果爆 ...

  6. bzoj 1005: [HNOI2008]明明的烦恼 树的prufer序列+万进制

    题目传送门 思路: 这道题需要前置知识prufer编码,这篇博客对prufer编码和这道题的分析写的很好. 这里主要讲一些对大数阶乘的分解,一个办法当然是用高精度,上面这篇博客用的是java,还有一个 ...

  7. 树的Prufer 编码和最小生成树计数

      Prufer数列 Prufer数列是无根树的一种数列.在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2.它可以通过简单的迭代方 ...

  8. 【BZOJ 1211】 1211: [HNOI2004]树的计数 (prufer序列、计数)

    1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2468  Solved: 868 Description 一 ...

  9. bzoj1211: [HNOI2004]树的计数(prufer序列+组合数学)

    1211: [HNOI2004]树的计数 题目:传送门 题解: 今天刚学prufer序列,先打几道简单题 首先我们知道prufer序列和一颗无根树是一一对应的,那么对于任意一个节点,假设这个节点的度数 ...

随机推荐

  1. JS基础语法之DOM01(找标签、改属性样式)

    DOM:暂时可以理解为找标签.改样式 1.BOM:   记住location这个就可以: location.href 获得当前页面的URL location.href = "URL" ...

  2. linux使用wget

    wget is a Linux command-line utility for retrieving files from the web, via HTTP, HTTPS and FTP prot ...

  3. spring_配置处理器对象、处理器映射器、处理器适配器、视图解析器

    创建spring配置文件:application-context.xml. 创建处理器类 package com.lanou.demo.controller;public class BookCont ...

  4. 廖雪峰Java10加密与安全-2加密算法-1URL编码

    1.URL编码 URL编码是浏览器发送数据给服务器时使用的编码. 如通过百度搜索美女: 编码前:https://www.baidu.com/s?wd=美女 编码后:https://www.baidu. ...

  5. 吴恩达《机器学习》课程总结(5)_logistic回归

    Q1分类问题 回归问题的输出可能是很大的数,而在分类问题中,比如二分类,希望输出的值是0或1,如何将回归输出的值转换成分类的输出0,1成为关键.注意logistics回归又称 逻辑回归,但他是分类问题 ...

  6. 关于HTML和Css的一些总结

    HTML HTML特点与基本结构 HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language). 超文本就是指页面内可以包含图片.链接 ...

  7. java基础之异常。

    异常: (1)异常:异常就是Java程序在运行过程中出现的错误. 异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象.其实就是Java对不正常情况进行描述后 ...

  8. Eureka客户端无法连接服务注册中心

    转载自:https://my.oschina.net/kousm/blog/2249003 服务端 application.yml配置 spring: application: name: eurek ...

  9. css3之属性选择器

    总体来看一下都有哪些选择器 1.属性选择器  1)[att*=val] 2)[att^=val] 3)[att$=val] 2.结构伪类选择器 3.UI伪类选择器 其中E:read-only伪类选择器 ...

  10. kuangbin带我飞QAQ DLX之一脸懵逼

    1. hust 1017 DLX精确覆盖 模板题 勉强写了注释,但还是一脸懵逼,感觉插入方式明显有问题但又不知道哪里不对而且好像能得出正确结果真是奇了怪了 #include <iostream& ...