JZOJ 5033. 【NOI2017模拟3.28】A
A
题面

思路
非常抽象地让你构造树,很容易想到 \(prufer\) 序列(如果你会的话)
说明一下:\(prufer\) 序列可以唯一确定一颗树的形态
若树的节点个数为 \(n\),那么 \(prufer\) 序列长度为 \(n-2\) ,且一个节点出现的个数为它的度数减一(不要问我为什么,因为 \(prufer\) 序列就是这样的)
那么我们就考虑 \(dp\) 了
设 \(f_{i,j,k}\) 表示考虑前 \(i\) 个数,选出 \(j\) 个数,当前 \(prufer\) 序列长度为 \(k\)。
为何要设 \(k\) ?因为一个节点在 \(prufer\) 序列中出现可能不止一次
考虑转移: \(f_{i,j,k} = \sum_{l=1}^{\min(a_i-1,k)}\binom{k}{l}f_{i-1,j-1,k-l}+f_{i-1,j,k}\)
\(f_{i-1,j,k}\) 意思是第 \(i\) 位不选
选的话,\(l\) 枚举选多少个,\(\binom{k}{l}\) 表示选了之后放到序列中的方案数
那么答案如何计算?
\(ans_x=\sum_{j=1}^x\binom{n-j}{x-j}f_{n,j,x-2}\)
意思是考虑 \(prufer\) 序列中数的种数,用 \(j\) 个数凑出长为 \(x-2\) 的序列。
因为叶子节点不会出现在序列中,所以我们再从剩下 \(n-j\) 个数中选出还差的 \(x-j\) 个数
\(Code\)
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const int N = 55;
const LL P = 1e9 + 7;
LL f[N][N][N] , fac[N];
int a[N] , n , T;
inline LL fpow(LL x , LL y)
{
LL res = 1;
while (y)
{
if (y & 1) res = res * x % P;
y >>= 1 , x = x * x % P;
}
return res;
}
inline LL C(int n , int m){return fac[n] * fpow(fac[m] * fac[n - m] % P , P - 2) % P;}
int main()
{
freopen("a.in" , "r" , stdin);
freopen("a.out" , "w" , stdout);
fac[0] = 1;
for(register int i = 1; i <= 52; i++) fac[i] = (i * 1LL * fac[i - 1]) % P;
scanf("%d" , &T);
while (T--)
{
scanf("%d" , &n);
for(register int i = 1; i <= n; i++) scanf("%d" , &a[i]);
memset(f , 0 , sizeof f);
f[0][0][0] = 1;
for(register int i = 1; i <= n; i++)
for(register int j = 0; j <= i; j++)
for(register int k = j; k <= n - 2; k++)
{
f[i][j][k] = f[i - 1][j][k];
if (j != 0) for(register int l = 1; l <= min(a[i] - 1 , k); l++)
f[i][j][k] = (f[i][j][k] + f[i - 1][j - 1][k - l] * C(k , l)) % P;
}
printf("%lld " , (LL)n);
LL ans;
for(register int x = 2; x <= n; x++)
{
ans = 0;
for(register int j = 0; j <= x; j++) ans = (ans + f[n][j][x - 2] * C(n - j , x - j) % P) % P;
printf("%lld " , ans);
}
printf("\n");
}
}
JZOJ 5033. 【NOI2017模拟3.28】A的更多相关文章
- JZOJ【NOIP2013模拟联考14】隐藏指令
JZOJ[NOIP2013模拟联考14]隐藏指令 题目 Description 在d维欧几里得空间中,指令是一个长度为2N的串.串的每一个元素为d个正交基的方向及反方向之一.例如,d = 1时(数轴) ...
- [jzoj 5178] [NOIP2017提高组模拟6.28] So many prefix? 解题报告(KMP+DP)
题目链接: https://jzoj.net/senior/#main/show/5178 题目: 题解: 我们定义$f[pos]$表示以位置pos为后缀的字符串对答案的贡献,答案就是$\sum_{i ...
- [jzoj 5177] [NOIP2017提高组模拟6.28] TRAVEL 解题报告 (二分)
题目链接: https://jzoj.net/senior/#main/show/5177 题目: 题解: 首先选出的泡泡怪一定是连续的一段 L,R 然后 L 一定属于虫洞左边界中的某一个 R 也同样 ...
- NOIP模拟 6.28
NOIP模拟赛6.28 Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这 ...
- [jzoj 5664] [GDOI2018Day1模拟4.6] 凫趋雀跃 解题报告(容斥原理)
interlinkage: https://jzoj.net/senior/#contest/show/2703/3 description: solution: 考虑容斥原理,枚举不合法的走的步数 ...
- [jzoj 6101] [GDOI2019模拟2019.4.2] Path 解题报告 (期望)
题目链接: https://jzoj.net/senior/#main/show/6101 题目: 题解: 设$f_i$表示从节点$i$到节点$n$的期望时间,$f_n=0$ 最优策略就是如果从$i, ...
- [jzoj 6093] [GDOI2019模拟2019.3.30] 星辰大海 解题报告 (半平面交)
题目链接: https://jzoj.net/senior/#contest/show/2686/2 题目: 题解: 说实话这题调试差不多花了我十小时,不过总算借着这道题大概了解了计算几何的基础知识 ...
- [jzoj 6080] [GDOI2019模拟2019.3.23] IOer 解题报告 (数学构造)
题目链接: https://jzoj.net/senior/#main/show/6080 题目: 题意: 给定$n,m,u,v$ 设$t_i=ui+v$ 求$\sum_{k_1+k_2+...+k_ ...
- [jzoj 6092] [GDOI2019模拟2019.3.30] 附耳而至 解题报告 (平面图转对偶图+最小割)
题目链接: https://jzoj.net/senior/#main/show/6092 题目: 知识点--平面图转对偶图 在求最小割的时候,我们可以把平面图转为对偶图,用最短路来求最小割,这样会比 ...
- [jzoj 6086] [GDOI2019模拟2019.3.26] 动态半平面交 解题报告 (set+线段树)
题目链接: https://jzoj.net/senior/#main/show/6086 题目: 题解: 一群数字的最小公倍数就是对它们质因数集合中的每个质因数的指数取$max$然后相乘 这样的子树 ...
随机推荐
- HCIE Routing&Switching之MPLS基础理论
技术背景 90年代初期,互联网流量快速增长,而由于当时硬件技术的限制,路由器采用最长匹配算法逐跳转发数据包,成为网络数据转发的瓶颈:于是快速路由技术成为当时研究的一个热点:在各种方案中,IETF确定了 ...
- chrom jsonview的使用
在开发中,我们可能要为不同的系统提供接口,并以说明文档的形式提供接口说明,但我们提供的返回json往往会在页面上乱成一团. 这里我们推荐chrome浏览器的小插件jsonview,他不但有利于我们对接 ...
- NOIP 口胡
因为没准备啥东西 这两天口胡一下近年 NOIP 的题 大概会一道不落?没什么很寄的考点主要是 2021 T1 报数 打一个 \(O(\log n)\) 查询 \(n\) 中是否有 \(7\),打一个类 ...
- python文件名解析---从文件名获得分类类别
python文件名解析-从文件名获得分类类别 python os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表.列表以字母顺序. listdir()方法 举例说明 lis ...
- CORS与CSRF在Spring Security中的使用
背景 在项目使用了Spring Security之后,很多接口无法访问了,从浏览器的网络调试窗看到的是CORS的报错和403的报错 分析 我们先来看一下CORS是什么,和它很相似的CSRF是什么,在S ...
- 关于JavaScript每句结尾是否需要添加分号问题
最近在学习JS的时候遇到这么一个问题.由于我之前的学习中一直是写一句JS代码,加一个分号.但是最近我才发现原来JS代码是可以不添加分号的.如果可以不写分号的话会不会更省事呢?于是我在网上查了相关资料整 ...
- day37-文件上传和下载
文件上传下载 1.基本介绍 在Web应用中,文件上传和下载是非常常见的功能 如果是传输大文件一般用专门的工具或者插件 文件上传和下载需要用到两个包:commons-fileupload.jar和com ...
- python 实现RSA数字签名
from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5 from Cryp ...
- uniapp微信小程序内部跳转其他微信小程序
uniapp小程序内点击某个按钮跳转另外一个小程序连接,具体实现步骤如下: <view class="home-Item" @click="goNativeinde ...
- vuex的使用详解
一.下载vuex 在store文件夹下的index.js中 官方文档:https://vuex.vuejs.org/zh/ 需要使用的页面 sotre中 mutations的调用方法 store ...