题目链接:戳我

prufer序列的问题。

prufer序列和无根树是一一对应的。而且在树中度数为k的点,在prufer序列中的出现次数为\(k-1\)次。

根据有限制次数的可重复元素的排列计数公式,我们可以知道答案是\(\frac{(n-2)!}{(du[1]-1)\times (du[2]-1)\times ... \times (du[n]-1)}\)

因为乘法中间可能会爆long long,所以采用分解质因数的方式。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<cstdio>
  6. #define MAXN 100010
  7. using namespace std;
  8. int n,m,tot,cnt;
  9. int d[MAXN],num[MAXN],prime[MAXN];
  10. long long ans=1;
  11. long long s[MAXN];
  12. inline bool check(int x)
  13. {
  14. for(int i=2;i<=sqrt(x);i++)
  15. if(x%i==0) return false;
  16. return true;
  17. }
  18. inline void get_prime()
  19. {
  20. for(int i=2;i<=150;i++)
  21. if(check(i))
  22. prime[++cnt]=i;
  23. }
  24. inline void solve(long long x,int f)
  25. {
  26. for(int i=1;i<=cnt;i++)
  27. {
  28. if(x<=1) return;
  29. while(x%prime[i]==0)
  30. num[i]+=f,x/=prime[i];
  31. }
  32. }
  33. int main()
  34. {
  35. #ifndef ONLINE_JUDGE
  36. freopen("ce.in","r",stdin);
  37. #endif
  38. s[1]=1;
  39. for(int i=2;i<=22;i++) s[i]=s[i-1]*i;
  40. get_prime();
  41. scanf("%d",&n);
  42. if(n==1)
  43. {
  44. int x;
  45. scanf("%d",&x);
  46. if(!x) printf("1\n");
  47. else printf("0\n");
  48. return 0;
  49. }
  50. for(int i=1;i<=n;i++)
  51. {
  52. scanf("%d",&d[i]);
  53. if(!d[i]){printf("0\n");return 0;}
  54. d[i]--;
  55. tot+=d[i];
  56. }
  57. if(tot!=n-2){printf("0\n");return 0;}
  58. solve(s[n-2],1);
  59. for(int i=1;i<=n;i++) solve(s[d[i]],-1);
  60. for(int i=1;i<=cnt;i++)
  61. while(num[i]--)
  62. ans*=prime[i];
  63. printf("%lld\n",ans);
  64. return 0;
  65. }

这个题是明明的烦恼的弱化版。

不过如果会做这个题,应该也会做那个题了。

现在我们只知道cnt个点的最终度数,我们假设\(sum=\sum_{i=1}^n (du[i]-1)\)那么现在的prufer序列的种类数应该是\(C_{n-2}^{sum}\times \frac{sum!}{\prod_{i=1}^{cnt} (du[i]-1)!}\)

而剩下来还有\(n-2-sum\)个位置,每个位置都可以填入除了cnt这些点的其他所有点,所以刚才的式子乘上一个\((n-cnt)^{n-2-sum}\)就行了。

HNOI2004 树的计数 | HNOI2008 明明的烦恼的更多相关文章

  1. 【BZOJ1005/1211】[HNOI2008]明明的烦恼/[HNOI2004]树的计数 Prufer序列+高精度

    [BZOJ1005][HNOI2008]明明的烦恼 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可 ...

  2. bzoj 1005: [HNOI2008]明明的烦恼 prufer编号&&生成树计数

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2248  Solved: 898[Submit][Statu ...

  3. 【算法】Prüfer编码 —— HNOI2004树的计数

    的确,如果不知道这个编码的话的确是一脸懵逼.在这里放一篇认为讲的很详细的 BLOG,有关于编码的方式 & 扩展在里面都有所提及. 欢迎点此进入 --> 大佬的博客 在这里主要想推导一下最 ...

  4. Luogu P2290 [HNOI2004]树的计数 Prufer序列+组合数

    最近碰了$prufer$ 序列和组合数..于是老师留了一道题:P2624 [HNOI2008]明明的烦恼 qwq要用高精... 于是我们有了弱化版:P2290 [HNOI2004]树的计数(考一样的可 ...

  5. 「BZOJ1005」[HNOI2008] 明明的烦恼

    「BZOJ1005」[HNOI2008] 明明的烦恼 先放几个prufer序列的结论: Prufer序列是一种对有标号无根树的编码,长度为节点数-2. 具体存在无根树转化为prufer序列和prufe ...

  6. [HNOI2008]明明的烦恼(prufer序列,高精度,质因数分解)

      prufer序列 定义 Prufer数列是无根树的一种数列.在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2. 描述 eg 将 ...

  7. BZOJ 1005 [HNOI2008] 明明的烦恼(组合数学 Purfer Sequence)

    题目大意 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为 1 到 N 的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为 N( ...

  8. bzoj1005 [HNOI2008]明明的烦恼

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3032  Solved: 1209 Description ...

  9. 【bzoj1005】[HNOI2008]明明的烦恼

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4175  Solved: 1660[Submit][Stat ...

随机推荐

  1. 超级实用的 Java 工具类

    超级实用的 Java 工具类 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取 ...

  2. jenkins+docker+git+etcd实现应用配置文件管理

    两台机器: 一台机器安装gitlab: http://www.cnblogs.com/cjsblogs/p/8716932.html 另一台机器安装etcd+docker+jenkins jenkin ...

  3. APOC官网触发器示例执行后Web页面一直转圈

    apoc使用触发器:如apoc官网指导 CREATE (d:Person {name:'Daniel'}) CREATE (l:Person {name:'Mary'}) CREATE (t:Pers ...

  4. html常用代码大全

    1.结构性定义 文件类型 <HTML></HTML> (放在档案的开头与结尾) 文件主题 <TITLE></TITLE> (必须放在「文头」区块内) 文 ...

  5. Django-DRF-视图的演变(二)

    Django-DRF-视图的演变   版本一(基于类视图APIView类) views.py: APIView是继承的Django View视图的. 1 from .serializers impor ...

  6. node jade || ejs引擎模板

    1.jade:破坏式2.ejs:保留式 -------------------------------------------------------------------------------- ...

  7. element-ui 中日期控件限制时间跨度

    支持点击今天及之前任意日期,前后跨度不超过31天,且不超过今天 <el-date-picker v-model="searchForm.dateRange" type=&qu ...

  8. maven入门-- part3 生命周期

    简介: Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是: Clean Lifecycle 在进行真正的构建之前进行一些清理工作. Default ...

  9. webpack整合 vue-router 路由,模块嵌套,整合Mint UI,MUI

    webpack整合 vue-router 结构 各个文件内容,一共八个文件, 还有src components 目录 Login.vue <template> <div> &l ...

  10. golang实现RSA加密解密

    非对称加密示意图: 在此可以看到,非对称加密是通过两个密钥(公钥-私钥)来实现对数据的加密和解密的.公钥用于加密,私钥用于解密. RSA公钥和私钥生成: package main import ( & ...