bzoj1211: prufer序列 | [HNOI2004]树的计数
题目大意:
告诉你树上每个节点的度数,让你构建出这样一棵树,问能够构建出树的种树
这里注意数量为0的情况,就是
当 n=1时,节点度数>0
n>1时,所有节点度数相加-n!=n-2 可以通过通过除了根,必然有n-1个节点作为上一个节点的儿子来理解
然后通过学习prufer序列可知
每一颗树都能够建成唯一的序列,这里的n-2个数就是任意插入到prufer序列中,这很明显就是一个排列,那么之后就是计算
ans = (n-2)!/(w[1]!*w[2]!..w[n]!) w[i]表示i节点上的度数减1,或者理解为以最大的点n作为根,i有多少个儿子节点。
这里不取模,防止值溢出,要分解质因数
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <vector> 5 using namespace std; 6 #define pii pair<int,int> 7 int n , w[200] , num[200]; 8 vector<pii> v[200]; 9 10 void solve(int m) 11 { 12 if(m==1) return; 13 int tmp = m; 14 for(int i=2 ; i<=m ; i++){ 15 if(m%i==0){ 16 int cnt = 0; 17 while(m%i==0){ 18 m/=i; 19 cnt++; 20 } 21 v[tmp].push_back(make_pair(i , cnt)); 22 } 23 } 24 if(m>1) v[tmp].push_back(make_pair(m , 1)); 25 // for(int i=0 ; i<v[tmp].size() ; i++) cout<<v[tmp][i].first<<" "<<v[tmp][i].second<<endl; 26 } 27 void init() 28 { 29 for(int i=1 ; i<=150 ; i++) solve(i); 30 } 31 void update(int k , int flag) 32 { 33 for(int i=0 ; i<v[k].size() ; i++){ 34 pii u=v[k][i]; 35 num[u.first]+=u.second*flag; 36 } 37 } 38 void mul(long long &ans , int k , int tim) 39 { 40 for(int i=1 ; i<=tim ; i++) ans=ans*k; 41 } 42 int main() 43 { 44 // freopen("Sweet.in" , "r" , stdin); 45 init(); 46 while(~scanf("%d" , &n)){ 47 memset(num , 0 , sizeof(num)); 48 int sum=0 , flag=true; 49 for(int i=1 ; i<=n ; i++){ 50 scanf("%d" , &w[i]); 51 if(n!=1 && w[i]<1) flag=false; 52 if(n==1 && w[i]!=0) flag=false; 53 w[i]--; 54 sum+=w[i]; 55 for(int j=1 ; j<=w[i] ; j++) update(j , -1); 56 } 57 if((n>1&&sum!=n-2) || flag==false){ 58 cout<<0<<endl; 59 continue; 60 } 61 for(int i=1 ; i<=n-2 ; i++) update(i , 1); 62 long long ans = 1; 63 for(int i=1 ; i<=n-2 ; i++){ 64 if(num[i]) mul(ans , i , num[i]); 65 } 66 cout<<ans<<endl; 67 } 68 return 0; 69 }
转载于:https://www.cnblogs.com/CSU3901130321/p/4895506.html
bzoj1211: prufer序列 | [HNOI2004]树的计数相关推荐
- BZOJ 1211: [HNOI2004]树的计数 purfer序列
1211: [HNOI2004]树的计数 Description 一个有n个结点的树,设它的结点分别为v1, v2, -, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给 ...
- bzoj 1211 [HNOI2004]树的计数
[HNOI2004]树的计数 Description 一个有n个结点的树,设它的结点分别为v1, v2, -, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, ...
- bzoj1211 [HNOI2004]树的计数 prufer序列+组合数
如果独自去想出prufer序列实在太难了 所以就只能直接用结论,把树转成prufer序列后这棵树和prufer序列是一一对应的关系 树->prufer序列:每次找到所有叶子结点中编号最小的,删掉 ...
- 最小生成树、矩阵树定理、Prufer序列总结
Kruskal算法 按边权排序,从小到大合并不在同一集合两点即可 Prim算法 每次加入一个到当前已选点集最近的点 P2619 [国家集训队]Tree I 考虑二分,每次给白边加上一个mid,通过这种 ...
- 【洛谷2624】[HNOI2008] 明明的烦恼(Python+利用prufer序列结论求解)
点此看题面 大致题意: 给你某些点的度数,其余点度数任意,让你求有多少种符合条件的无根树. \(prufer\)序列 一道弱化版的题目:[洛谷2290][HNOI2004] 树的计数. 这同样也是一道 ...
- 【BZOJ1211】【HNOI2004】树的计数(prufer序,组合数)
Description 一个有n个结点的树,设它的结点分别为v1, v2, -, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, -, dn,编程需要 ...
- 树的计数(prufer序列 或 purfer序列)
题解 首先我们要知道一条性质,prufer序列中的某个点出现次数为该点在树中度数-1 感性理解一下,其实按照prufer序列求法自己推一下就出来了 设题目里给的度为$d[]$ 先将所有的d-- 然后按 ...
- 【学习笔记】树的计数,prufer(Prüfer)编码,Cayley公式及相应例题
目录 1.pruferpruferprufer编码 1)无根树转化为prufer序列 2)prufer序列转化为无根树. 2.Cayley公式 1)由Cayley公式得到四个推论 例题1.P4981 ...
- 【XSY1295】calc n个点n条边无向连通图计数 prufer序列
题目大意 求\(n\)个点\(n\)条边的无向连通图的个数 \(n\leq 5000\) 题解 显然是一个环上有很多外向树. 首先有一个东西:\(n\)个点选\(k\)个点作为树的根的生成森林个数为: ...
最新文章
- Eclipse SVN插件冲突导致不能使用解决办法
- ActiveMQ的使用
- java中接口适配器实现,12.1.8 Java中的应用-AWT事件适配器(接口的适配器模式)...
- 为什么判断 n 是否为质数只需除到开平方根就行了?(直接证明)
- logback配置文件详解_Log4j2使用详解
- SpringCache与Redis
- [php] 高级教程
- ThreadLocal原理机制
- 递归、os.walk、内置函数、lambda、hashlib模块、md5加密、python安装第三方模块、操作mysql数据库...
- 两者结合在一起看SphereFace
- Docker图形界面
- 中公电网计算机类题库讲练版百度云,2021电网二批招聘考试题库:计算机类练习题(5)...
- Linux安装Prometheus
- ipad文献管理软件_【MAC上写论文有哪些好的文献管理软件可以推荐?】-看准网
- 恩智浦智能汽车竞赛电磁组总结
- Builder模式和工厂模式的区别
- RSA/数字证书/签名原理详解
- 海康威视摄像头rtsp地址
- 解决使用ssh工具远程连接到服务器上因为网络波动而需要重连的问题
- 恐龙为何不发明计算机,为什么恐龙没有产生智慧文明,而人类文明反而如此发达?...
热门文章
- Itsdangerous应用
- python 僵尸进程孤儿进程
- click group实例
- linux 命令行图形界面切换
- C语言 堆内存操作
- 输入法半角和全角的快捷转换_华宇拼音输入法 一款完全免费的国产输入法_第1页...
- 压测学习总结(3)——Jmeter 脚本如何生成
- Jquery学习总结(3)——Jquery获取当前城市的天气信
- python list删除元素速度慢_python list(python list删除元素是要注意的坑点)
- char(128) mysql_char能表示(-128~127)