2021.07.19 P2624 明明的烦恼(prufer序列,为什么杨辉三角我没搞出来?)
2021.07.19 P2624 明明的烦恼(prufer序列,为什么杨辉三角我没搞出来?)
[P2624 HNOI2008]明明的烦恼 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
重点:
1.prufer序列
2.组合数学
题意:
n个点,有部分点已经确定度数,有的随意,问有多少棵树满足已知度数要求。
分析:
还能分析个锤子出来,prufer序列啊,记得开高精,杨辉三角被我玩儿废了,搞不定,我太菜了。
设已知度数的点有k个,总度数-k为s,一共有n个点。
则这k个点能形成的树的个数为
\]
因为是n-2个点中随意选s个点(暂时把这些所有的点看成不同的点),所以还要再乘上下面一坨东东
\]
最后还要乘上其它n-2-k个数的随机排列
\]
所以总公式为
\]
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n,cnt,a[1010],sum,tot;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
struct node{
int num[10100],len;
node(){
memset(num,0,sizeof(num));
len=1;
}
node operator *(const int &x)const{
node ans;
ans.len=len+6;
for(int i=1;i<=len;i++)ans.num[i]+=num[i]*x;
for(int i=1;i<ans.len;i++){
if(ans.num[i]>9){
ans.num[i+1]+=ans.num[i]/10;
ans.num[i]%=10;
}
}
while(!ans.num[--ans.len]);
return ans;
}
node operator /(const int &x)const{
node ans;
ans=*this;
++ans.len;
for(int i=ans.len;i;i--){
ans.num[i-1]+=ans.num[i]%x*10;
ans.num[i]/=x;
}
while(!ans.num[--ans.len]);
return ans;
}
}ans;
int main(){
n=read();
for(int i=1;i<=n;i++){
a[i]=read();
if(!a[i])return cout<<"0",0;
else if(a[i]!=-1)sum+=a[i]-1,++cnt;
}
if(sum>2*n-2)return cout<<"0",0;
ans.num[1]=1;
for(int i=n-1-sum;i<n-1;i++)ans=ans*i;
for(int i=1;i<=n-2-sum;i++)ans=ans*(n-cnt);
for(int i=1;i<=n;i++)for(int j=2;j<=a[i]-1;j++)
ans=ans/j;
for(int i=ans.len;i;i--)cout<<ans.num[i];
return 0;
}
2021.07.19 P2624 明明的烦恼(prufer序列,为什么杨辉三角我没搞出来?)的更多相关文章
- 【bzoj1005】[HNOI2008]明明的烦恼 Prufer序列+高精度
题目描述 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? 输入 第一行为N(0 < N < = 1000),接下来N行,第i+1行给出第i ...
- bzoj1005: [HNOI2008]明明的烦恼 prufer序列
https://www.lydsy.com/JudgeOnline/problem.php?id=1005 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的 ...
- BZOJ 1005 明明的烦恼(prufer序列+高精度)
有一种东西叫树的prufer序列,一个树的与一个prufer序列是一一对应的关系. 设有m个度数确定的点,这些点的度为dee[i],那么每个点在prufer序列中出现了dee[i]-1次. 由排列组合 ...
- BZOJ 1005 明明的烦恼 Prufer序列+组合数学+高精度
题目大意:给定一棵n个节点的树的节点的度数.当中一些度数无限制,求能够生成多少种树 Prufer序列 把一棵树进行下面操作: 1.找到编号最小的叶节点.删除这个节点,然后与这个叶节点相连的点计入序列 ...
- 2021.07.19 P2294 狡猾的商人(差分约束)
2021.07.19 P2294 狡猾的商人(差分约束) [P2294 HNOI2005]狡猾的商人 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.差分约束最长路与最短 ...
- 2021.07.19 BZOJ2654 tree(生成树)
2021.07.19 BZOJ2654 tree(生成树) tree - 黑暗爆炸 2654 - Virtual Judge (vjudge.net) 重点: 1.生成树的本质 2.二分 题意: 有一 ...
- Luogu P2624 [HNOI2008]明明的烦恼 Prufer+组合+高精
好的我把标准版过了... 设$ r_i$为$i$的度数 首先,我们设 $ sum = \Sigma r_i-1$,$ tot $ 为所有能够确定度数的点 所以我们有 $ C ^ {sum} _{n-2 ...
- bzoj 1005: [HNOI2008]明明的烦恼 prufer编号&&生成树计数
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2248 Solved: 898[Submit][Statu ...
- BZOJ 1005 [HNOI2008]明明的烦恼 (Prufer编码 + 组合数学 + 高精度)
1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5786 Solved: 2263[Submit][Stat ...
随机推荐
- Java的浅克隆和深克隆
如何实现对象的克隆 (1)实现 Cloneable 接口并重写 Object 类中的 clone() 方法: (2)实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真 ...
- 1分钟为Win10瘦身!把吃掉的硬盘找回来
很多小伙伴升级完Win10后都发现C盘变小了,不少人以为这大概就是Win10太占磁盘空间了.但事实上,Win10和以前的操作系统一样,对于C盘空间并没有什么太高要求.出现这个问题的主要原因,是Win1 ...
- java LinkedList (详解)
Java 链表(LinkedList) 一.链表简介 1.链表 (Linked List) 是一种常见的基础数据结构,是一种线性表,但是链表不会按线性表的顺序存储数据,而是每个节点里存到下一个节点的地 ...
- js学习笔记-Java script正则表达式
创建正则表达式 js中的正则包含在两个斜杠之间:/abc+v/ 正则中的特殊字符 \: 1.当后面不是特殊字符时表示字符边界 2.当后面是特殊字符时表示转义 ^: 1.匹配首位,例如,/^A/ 并不会 ...
- Hadoop全分布式
1.安装jdk Linux下安装jdk-7u67-linux-x64.rpm 2.免密登录 ssl免密登录(centos6) 3.同步时间:date -s "2020-04-0 ...
- lombok的使用。
今天学习spring event,无意中看到lombok插件,以前也见同事用过,特此看了下用法.觉得还挺好用,记录下. 网上找到的一个比较术语化的解释:lombok是一个基于LGPL的开源J2EE综合 ...
- WSGI是个啥?大白话告诉你wsgi做了什么!
定义: 官方定义:wsgi是Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之 ...
- 学习openstack(二)
OpenStack企业私有云实践 1. 实验架构 OpenStack我们把它当作是一个全新的"Linux"系统来学习,有的时候我们也把OpenStack称之为一个新的Lin ...
- Netty学习摘记 —— 心跳机制 / 基于分隔符和长度的协议
本文参考 本篇文章是对<Netty In Action>一书第十一章"预置的ChannelHandler和编解码器"的学习摘记,主要内容为通过 SSL/TLS 保护 N ...
- ACM中的位运算技巧
听说位运算挺好玩的,那这节总结一下ACM中可能用到的位运算技巧. XOR运算极为重要!!(过[LC136](只出现一次的数字 - 力扣(LeetCode)):数组中每个数字都出现两次,只有一个出现一次 ...