P2290 [HNOI2004]树的计数(bzoj1211)
洛谷P2290 [HNOI2004]树的计数
bzoj1211 [HNOI2004]树的计数
Description
一个有\(n\)个结点的树,设它的结点分别为\(v_1,v_2,\cdots, v_n\),已知第\(i\)个结点\(v_i\)的度数为\(d_i\)
问满足这样的条件的不同的树有多少棵。
Input
第一行是一个正整数\(n\),表示树有\(n\)个结点。第二行有\(n\)个数,第\(i\)个数表示\(d_i\),即树的第\(i\)个结点的度数。其中\(1\le n\le 150\),输入数据保证满足条件的树不超过\(10^{17}\)个。
Output
输出满足条件的树有多少棵。
可以说是个模板题
prufer 编码,这里只给结论,证明去这里看
我不想复制一遍了
注意一下以下说的“种”和“个”是不同的
由于 prufer 编码的一些性质,其实问题求的就是,总共\(n-2\)个元素,其中有\(n\)种不同元素,每种元素有\(d_i-1\)个,的排列数
所以,如果\(\sum_{i+1}^nd_i-1\neq n-2\)或者\(d_i=0\)则无解,不过要特判\(n=1\)的情况
如何证明在那个链接里都有
首先如果没有这个每种元素多少个的条件,那么\(n-2\)个元素的排列数就是\((n-2)!\)
然后要去重,因为对于每一种元素,这\(d_i-1\)个元素无论怎么变换顺序都是算一种,所以当然要除以\((d_i-1)!\)
那么答案就是:
\]
但是题目保证的是最后结果不大于\(10^{17}\),所以中间值可能会爆\(long long\)
那么我们采取分解质因数的方法,最后再乘起来
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#define reg register
#define EN std::puts("")
#define LL long long
inline int read(){
register int x=0;register int y=1;
register char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
int n;
int prime[155],notprime[155];
inline void get_prime(){
for(reg int i=2;i<=n;i++){
if(notprime[i]) continue;
prime[++prime[0]]=i;
for(reg int j=i+i;j<=n;j+=i) notprime[j]=1;
}
}
int num[155],d[155];
inline void mul(int x,int k){
for(reg int i=1;i<=prime[0];i++)
while(!(x%prime[i])) num[i]+=k,x/=prime[i];
}
int main(){
n=read();
if(n==1){
d[1]=read();
return std::puts(d[1]?"0":"1"),0;
}
get_prime();
int sum=0;
for(reg int i=1;i<=n;i++){
sum+=d[i]=read()-1;
if(d[i]==-1) return std::puts("0"),0;
}
if(sum!=n-2) return std::puts("0"),0;
for(reg int i=1;i<=n-2;i++) mul(i,1);
for(reg int i=1;i<=n;i++)
for(reg int j=1;j<=d[i];j++) mul(j,-1);
LL ans=1;
for(reg int i=1;i<=prime[0];i++)
for(reg int j=1;j<=num[i];j++) ans*=prime[i];
std::printf("%lld",ans);
return 0;
}
P2290 [HNOI2004]树的计数(bzoj1211)的更多相关文章
- Luogu P2290 [HNOI2004]树的计数 Prufer序列+组合数
最近碰了$prufer$ 序列和组合数..于是老师留了一道题:P2624 [HNOI2008]明明的烦恼 qwq要用高精... 于是我们有了弱化版:P2290 [HNOI2004]树的计数(考一样的可 ...
- P2290 [HNOI2004]树的计数
P2290 [HNOI2004]树的计数prufer序列模板题 #include <iostream> #include <cstdio> #include <queue ...
- 洛谷 P2290 [HNOI2004]树的计数
题目描述 输入输出格式 输入格式: 输入文件第一行是一个正整数n,表示树有n个结点.第二行有n个数,第i个数表示di,即树的第i个结点的度数.其中1<=n<=150,输入数据保证满足条件的 ...
- LUOGU P2290 [HNOI2004]树的计数(组合数,prufer序)
传送门 解题思路 \(prufer\)序,就是所有的不同的无根树,都可以转化为唯一的序列.做法就是每次从度数为\(1\)的点中选出一个字典序最小的,把这个点删掉,并把这个点相连的节点加入序列,直到只剩 ...
- bzoj1211: [HNOI2004]树的计数 prufer编码
题目链接 bzoj1211: [HNOI2004]树的计数 题解 prufer序 可重排列计数 代码 #include<bits/stdc++.h> using namespace std ...
- BZOJ1211: [HNOI2004]树的计数
1211: [HNOI2004]树的计数 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1245 Solved: 383[Submit][Statu ...
- prufer BZOJ1211: [HNOI2004]树的计数
以前做过几题..好久过去全忘了. 看来是要记一下... [prufer] n个点的无根树(点都是标号的,distinct)对应一个 长度n-2的数列 所以 n个点的无根树有n^(n-2)种 树 转 p ...
- bzoj1211: [HNOI2004]树的计数(prufer序列+组合数学)
1211: [HNOI2004]树的计数 题目:传送门 题解: 今天刚学prufer序列,先打几道简单题 首先我们知道prufer序列和一颗无根树是一一对应的,那么对于任意一个节点,假设这个节点的度数 ...
- [bzo1211][HNOI2004]树的计数_prufer序列
树的计数 bzoj-1211 HNOI-2004 题目大意:题目链接. 注释:略. 想法: prufer序列有一个性质就是一个数在prufer序列中出现的次数等于这个prufer序列生成的树中它的度数 ...
随机推荐
- 第一章 AT&T
1.一个公司(企业)越庞大,就越危险:越复杂,就越濒临坍塌:快速发展的同时,也埋下了隐患. 2.再庞大的企业也不可能永久站立,下个十年谁也说不准谁会在浪潮之巅. 3.一个人能走多远,往往取决于他能看多 ...
- Continue 和 Break
1.什么是continue和break continue:继续的.持续的 break:冲断的.折断的 作用:用于终止循环体,主要用于switch条件语句和循环体条件语句(for.while.do-wh ...
- python脚本如何同时运行多个
当我们想一次运行多个py脚本的时候你想到了什么应用场景了吗?当你想同时并行的处理一些对象时你有什么好方法吗?下面我就简单的总结一些这方面的小技巧,方便大家根据情况灵活处理. 1 用一个py脚本运行多个 ...
- 解决项目迁移至Kubernetes集群中的代理问题
解决项目迁移至Kubernetes集群中的代理问题 随着Kubernetes技术的日益成熟,越来越多的企业选择用Kubernetes集群来管理项目.新项目还好,可以选择合适的集群规模从零开始构建项目: ...
- 测试需要用到的chrome调试
模拟慢网速 断开网络 F12后勾选上offline 请求304 后来发现是选中了该浏览其的Disable cache,去掉就好了.
- Laravel 5.8 RCE 分析
原帖地址 : https://xz.aliyun.com/t/6059 Laravel 代码审计 环境搭建 composer create-project --prefer-dist laravel/ ...
- java 一维数组的总结笔记
数组 1. 一位数组的声明方式 type[] array Name 或 type arrayName[];(推荐使用第二种) 错误的声明方式 //int[5] intErrorArray;错误的 // ...
- 最新VMware虚拟机安装Linux系统-CentOS(详细教程)
一.前言 最近有网友反应初学Linx不会安装,找了许多教程不是太全面,总会遇到一些要不是启动不了,要不是连不上网,各种问题,为了让大家能够顺利的安装,小乐写了一个非常详细的教程,让大家少入坑. 二.背 ...
- 神奇的Kivy,让Python快速开发移动app
随着移动互联网的不断发展,手机.Pad等移动终端已经被普遍使用,充斥在人们的工作.学习和生活中,越来越多的程序都转向移动终端,各类app应用相拥而至. Kivy作为Python的Android和IOS ...
- 【轮询】【ajax】【js】【spring boot】ajax超时请求:前端轮询处理超时请求解决方案 + spring boot服务设置接口超时时间的设置
场景描述: ajax设置timeout在本机测试有效,但是在生产环境等外网环境无效的问题 1.ajax的timeout属性设置 前端请求超时事件[网络连接不稳定时候,就无效了] var data = ...