题目大意:

告诉你树上每个节点的度数,让你构建出这样一棵树,问能够构建出树的种树

这里注意数量为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]树的计数相关推荐

  1. BZOJ 1211: [HNOI2004]树的计数 purfer序列

    1211: [HNOI2004]树的计数 Description 一个有n个结点的树,设它的结点分别为v1, v2, -, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给 ...

  2. bzoj 1211 [HNOI2004]树的计数

    [HNOI2004]树的计数 Description 一个有n个结点的树,设它的结点分别为v1, v2, -, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, ...

  3. bzoj1211 [HNOI2004]树的计数 prufer序列+组合数

    如果独自去想出prufer序列实在太难了 所以就只能直接用结论,把树转成prufer序列后这棵树和prufer序列是一一对应的关系 树->prufer序列:每次找到所有叶子结点中编号最小的,删掉 ...

  4. 最小生成树、矩阵树定理、Prufer序列总结

    Kruskal算法 按边权排序,从小到大合并不在同一集合两点即可 Prim算法 每次加入一个到当前已选点集最近的点 P2619 [国家集训队]Tree I 考虑二分,每次给白边加上一个mid,通过这种 ...

  5. 【洛谷2624】[HNOI2008] 明明的烦恼(Python+利用prufer序列结论求解)

    点此看题面 大致题意: 给你某些点的度数,其余点度数任意,让你求有多少种符合条件的无根树. \(prufer\)序列 一道弱化版的题目:[洛谷2290][HNOI2004] 树的计数. 这同样也是一道 ...

  6. 【BZOJ1211】【HNOI2004】树的计数(prufer序,组合数)

    Description 一个有n个结点的树,设它的结点分别为v1, v2, -, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, -, dn,编程需要 ...

  7. 树的计数(prufer序列 或 purfer序列)

    题解 首先我们要知道一条性质,prufer序列中的某个点出现次数为该点在树中度数-1 感性理解一下,其实按照prufer序列求法自己推一下就出来了 设题目里给的度为$d[]$ 先将所有的d-- 然后按 ...

  8. 【学习笔记】树的计数,prufer(Prüfer)编码,Cayley公式及相应例题

    目录 1.pruferpruferprufer编码 1)无根树转化为prufer序列 2)prufer序列转化为无根树. 2.Cayley公式 1)由Cayley公式得到四个推论 例题1.P4981 ...

  9. 【XSY1295】calc n个点n条边无向连通图计数 prufer序列

    题目大意 求\(n\)个点\(n\)条边的无向连通图的个数 \(n\leq 5000\) 题解 显然是一个环上有很多外向树. 首先有一个东西:\(n\)个点选\(k\)个点作为树的根的生成森林个数为: ...

最新文章

  1. Eclipse SVN插件冲突导致不能使用解决办法
  2. ActiveMQ的使用
  3. java中接口适配器实现,12.1.8 Java中的应用-AWT事件适配器(接口的适配器模式)...
  4. 为什么判断 n 是否为质数只需除到开平方根就行了?(直接证明)
  5. logback配置文件详解_Log4j2使用详解
  6. SpringCache与Redis
  7. [php] 高级教程
  8. ThreadLocal原理机制
  9. 递归、os.walk、内置函数、lambda、hashlib模块、md5加密、python安装第三方模块、操作mysql数据库...
  10. 两者结合在一起看SphereFace
  11. Docker图形界面
  12. 中公电网计算机类题库讲练版百度云,2021电网二批招聘考试题库:计算机类练习题(5)...
  13. Linux安装Prometheus
  14. ipad文献管理软件_【MAC上写论文有哪些好的文献管理软件可以推荐?】-看准网
  15. 恩智浦智能汽车竞赛电磁组总结
  16. Builder模式和工厂模式的区别
  17. RSA/数字证书/签名原理详解
  18. 海康威视摄像头rtsp地址
  19. 解决使用ssh工具远程连接到服务器上因为网络波动而需要重连的问题
  20. 恐龙为何不发明计算机,为什么恐龙没有产生智慧文明,而人类文明反而如此发达?...

热门文章

  1. Itsdangerous应用
  2. python 僵尸进程孤儿进程
  3. click group实例
  4. linux 命令行图形界面切换
  5. C语言 堆内存操作
  6. 输入法半角和全角的快捷转换_华宇拼音输入法 一款完全免费的国产输入法_第1页...
  7. 压测学习总结(3)——Jmeter 脚本如何生成
  8. Jquery学习总结(3)——Jquery获取当前城市的天气信
  9. python list删除元素速度慢_python list(python list删除元素是要注意的坑点)
  10. char(128) mysql_char能表示(-128~127)