Description

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

Input

第一行是一个正整数n,表示树有n个结点。第二行有n个数,第i个数表示di,即树的第i个结点的度数。其中1<=n<=150,输入数据保证满足条件的树不超过10^17个。

Output

输出满足条件的树有多少棵。

Sample Input

4

2 1 2 1

Sample Output

2

Solution

水一道题

prufer序上每个点出现的次数等于它的度数-1

那么这道题就转化成了一个序列,要有一些位置放某一个数,另一些位置放某一个数,另一些位置……

就是个组合数裸题了

最后其实有个结论式子,就是题目的条件,最后结果是 \(\frac{(n-2)!}{(d_1-1)!(d_2-1)!...(d_n-1)!}\)

然后这道题卡精度,要么写高精,要么如下程序里写的分解质因数计算,最后相乘的答案

  1. #include<bits/stdc++.h>
  2. #define ui unsigned int
  3. #define ll long long
  4. #define db double
  5. #define ld long double
  6. #define ull unsigned long long
  7. const int MAXN=150+10;
  8. int n,d[MAXN],cnt[MAXN];
  9. ll ans;
  10. std::vector<int> V[MAXN];
  11. template<typename T> inline void read(T &x)
  12. {
  13. T data=0,w=1;
  14. char ch=0;
  15. while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
  16. if(ch=='-')w=-1,ch=getchar();
  17. while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
  18. x=data*w;
  19. }
  20. template<typename T> inline void write(T x,char ch='\0')
  21. {
  22. if(x<0)putchar('-'),x=-x;
  23. if(x>9)write(x/10);
  24. putchar(x%10+'0');
  25. if(ch!='\0')putchar(ch);
  26. }
  27. template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
  28. template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
  29. template<typename T> inline T min(T x,T y){return x<y?x:y;}
  30. template<typename T> inline T max(T x,T y){return x>y?x:y;}
  31. inline void init()
  32. {
  33. for(register int x=2;x<=150;++x)
  34. {
  35. int i=2,now=x;
  36. while(now>1)
  37. {
  38. while(now%i==0)V[x].push_back(i),now/=i;
  39. ++i;
  40. }
  41. }
  42. }
  43. inline ll qexp(ll a,ll b)
  44. {
  45. ll res=1;
  46. while(b)
  47. {
  48. if(b&1)res=res*a;
  49. a=a*a;
  50. b>>=1;
  51. }
  52. return res;
  53. }
  54. int main()
  55. {
  56. init();
  57. read(n);
  58. for(register int i=1;i<=n;++i)read(d[i]);
  59. if(n==1)
  60. {
  61. write(d[1]==0,'\n');
  62. return 0;
  63. }
  64. int all=0;
  65. for(register int i=1;i<=n;++i)
  66. if(!d[i])
  67. {
  68. puts("0");
  69. return 0;
  70. }
  71. else all+=d[i]-1;
  72. if(all!=n-2)
  73. {
  74. puts("0");
  75. return 0;
  76. }
  77. ans=1;
  78. for(register int x=2;x<=n-2;++x)
  79. for(register int i=0,lt=V[x].size();i<lt;++i)cnt[V[x][i]]++;
  80. for(register int i=1;i<=n;++i)
  81. for(register int x=2;x<=d[i]-1;++x)
  82. for(register int j=0,lt=V[x].size();j<lt;++j)cnt[V[x][j]]--;
  83. for(register int i=1;i<=n;++i)
  84. if(cnt[i]<0)ans=0;
  85. else ans*=qexp(i,cnt[i]);
  86. write(ans,'\n');
  87. return 0;
  88. }

【刷题】BZOJ 1211 [HNOI2004]树的计数的更多相关文章

  1. BZOJ 1211: [HNOI2004]树的计数( 组合数学 )

    知道prufer序列就能写...就是求个可重集的排列...先判掉奇怪的情况, 然后答案是(N-2)!/π(d[i]-1)! -------------------------------------- ...

  2. bzoj 1211: [HNOI2004]树的计数 -- purfer序列

    1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MB Description 一个有n个结点的树,设它的结点分别为v1, v2, ...

  3. BZOJ 1211 HNOI2004 树的计数 Prufer序列

    题目大意:给定一棵树中全部点的度数,求有多少种可能的树 Prufer序列.详细參考[HNOI2008]明明的烦恼 直接乘会爆long long,所以先把每一个数分解质因数.把质因数的次数相加相减.然后 ...

  4. BZOJ 1211[HNOI2004]树的计数 - prufer数列

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

  5. bzoj 1211: [HNOI2004]树的计数

    prufer的应用.. 详细见这篇博客:https://www.cnblogs.com/dirge/p/5503289.html import java.math.BigInteger; import ...

  6. 【BZOJ 1211】 1211: [HNOI2004]树的计数 (prufer序列、计数)

    1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2468  Solved: 868 Description 一 ...

  7. BZOJ1211: [HNOI2004]树的计数

    1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1245  Solved: 383[Submit][Statu ...

  8. prufer BZOJ1211: [HNOI2004]树的计数

    以前做过几题..好久过去全忘了. 看来是要记一下... [prufer] n个点的无根树(点都是标号的,distinct)对应一个 长度n-2的数列 所以 n个点的无根树有n^(n-2)种 树 转 p ...

  9. bzoj1211: [HNOI2004]树的计数(prufer序列+组合数学)

    1211: [HNOI2004]树的计数 题目:传送门 题解: 今天刚学prufer序列,先打几道简单题 首先我们知道prufer序列和一颗无根树是一一对应的,那么对于任意一个节点,假设这个节点的度数 ...

随机推荐

  1. 4361: isn

    4361: isn https://lydsy.com/JudgeOnline/problem.php?id=4361 分析: dp+容斥. 首先计算出每个长度有多少种子序列是非降的.这一步可以$n^ ...

  2. 获取文件mimes

    <?php /* * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licen ...

  3. 修改索引名称(mysql)

    MySQL修改索引名称. 对于MySQL 5.7及以上版本,可以执行以下命令: ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_inde ...

  4. 使用Xamarin实现串口通讯

    前几天我写了年度总结,然后有人说让我教一下他Xamarin串口通讯怎么做,其实跟java没有多大区别. 记得我刚开始接到公司这个项目的时候很懵逼,我去看了别的安卓串口工具,都不行我当时是RS232串口 ...

  5. 搭建docker 私有镜像仓库

    前期准备 服务器:centos 7.3 docker-ce: 18.06.1-ce docker-compose: 1.22.0 docker 安装 首先,更新系统 yum update yum up ...

  6. 2019CSUST集训队选拔赛题解(三)

    PY学长的放毒题 Description 下面开始PY的香港之行,PY有n个要去的小吃店,这n个小吃店被m条路径联通起来. PY有1个传送石和n−1个传送石碎片. PY可以用传送石标记一个小吃店作为根 ...

  7. Python数据挖掘——基础知识

    Python数据挖掘——基础知识 数据挖掘又称从数据中 挖掘知识.知识提取.数据/模式分析 即为:从数据中发现知识的过程 1.数据清理 (消除噪声,删除不一致数据) 2.数据集成 (多种数据源 组合在 ...

  8. 算法笔记(c++)--c++中碰到的一些用法

    算法笔记(c++)--c++中碰到的一些用法 toupper(xxx)可以变成大写; tolower(xx)小写 isalpha(xxx)判断是不是字母 isalnum(xx)判断是不是数字 abs( ...

  9. Immutable 常用API简介

    本文主要整理了Immutable.js常用API的使用. Immutable 是什么? 关于Immutable的定义,官方文档是这样说的: Immutable data encourages pure ...

  10. 用了这么多年的MCU,你知道哪些MCU原厂最牛?

    单片机诞生于1971年,经历了SCM.MCU.SoC三大阶段.单片机由以前的1位.4位.8位.16位,发展到现在的32位甚至64位. 90年代后随着消费电子产品大发展,单片机技术得到了巨大提高,相继诞 ...