题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4661

  题意:有n个人呈树状结构,每个人知道一个独特的消息。每次可以让一个人将他所知的所有消息告诉和他相邻的人。求所有人都知道所有消息花时花的步数最少的所有方案数。

  首先需要满足的是最小的步数,所以我们一定是先把所有消息先传到一个人手中才是最优的,然后再从这个人传回去,也就是每条边走两次。我们只需要考虑单向传到某个人的方案数cnt,因为再传回去也是cnt。那么我们可以枚举每个点为收集点,把所有的和加起来就是答案。这里就是一个树形DP的问题,转移的时候是一个组合问题:记录f[u],cnt[u],f[u]为以u为根的子树的拓扑排序数,cnt[u]为以u为子树的节点个数。这里,涉及到如何合并两个子树,比如u的两个子树v1,v2,那么合并后的拓扑排序数为:f[u]=f[son1]*f[son2]*C(cnt[son1]+cnt[son2],cnt[son1]),也就是:

  这里只求出了根节点的方案,还要再做一次搜索,把其它点的方案求出了,根据上面那个公式推一下就可以了。。。

  1. //STATUS:C++_AC_3062MS_49796KB
  2. #include <functional>
  3. #include <algorithm>
  4. #include <iostream>
  5. //#include <ext/rope>
  6. #include <fstream>
  7. #include <sstream>
  8. #include <iomanip>
  9. #include <numeric>
  10. #include <cstring>
  11. #include <cassert>
  12. #include <cstdio>
  13. #include <string>
  14. #include <vector>
  15. #include <bitset>
  16. #include <queue>
  17. #include <stack>
  18. #include <cmath>
  19. #include <ctime>
  20. #include <list>
  21. #include <set>
  22. #include <map>
  23. using namespace std;
  24. #pragma comment(linker,"/STACK:102400000,102400000")
  25. //using namespace __gnu_cxx;
  26. //define
  27. #define pii pair<int,int>
  28. #define mem(a,b) memset(a,b,sizeof(a))
  29. #define lson l,mid,rt<<1
  30. #define rson mid+1,r,rt<<1|1
  31. #define PI acos(-1.0)
  32. //typedef
  33. typedef __int64 LL;
  34. typedef unsigned __int64 ULL;
  35. //const
  36. const int N=;
  37. const int INF=0x3f3f3f3f;
  38. const LL MOD=,STA=;
  39. const LL LNF=1LL<<;
  40. const double EPS=1e-;
  41. const double OO=1e30;
  42. const int dx[]={-,,,};
  43. const int dy[]={,,,-};
  44. const int day[]={,,,,,,,,,,,,};
  45. //Daily Use ...
  46. inline int sign(double x){return (x>EPS)-(x<-EPS);}
  47. template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
  48. template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
  49. template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
  50. template<class T> inline T Min(T a,T b){return a<b?a:b;}
  51. template<class T> inline T Max(T a,T b){return a>b?a:b;}
  52. template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
  53. template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
  54. template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
  55. template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
  56. //End
  57.  
  58. LL fac[N],rev[N],f[N],cnt[N];
  59. int T,n;
  60. LL ans;
  61. vector<int> q[N];
  62.  
  63. void exgcd(LL a,LL b,LL &d,LL &x,LL &y)
  64. {
  65. if(!b){d=a;x=;y=;}
  66. else {exgcd(b,a%b,d,y,x);y-=x*(a/b);}
  67. }
  68.  
  69. LL inv(LL a,LL n)
  70. {
  71. LL d,x,y;
  72. exgcd(a,n,d,x,y);
  73. return (x+n)%n;
  74. }
  75.  
  76. void dfs1(int u,int fa)
  77. {
  78. int i,v;
  79. cnt[u]=f[u]=;
  80. for(i=;i<q[u].size();i++){
  81. if((v=q[u][i])==fa)continue;
  82. dfs1(v,u);
  83. cnt[u]+=cnt[v];
  84. f[u]=((f[u]*f[v])%MOD*rev[cnt[v]])%MOD;
  85. }
  86. f[u]=(f[u]*fac[cnt[u]-])%MOD;
  87. }
  88.  
  89. void dfs2(int u,int fa)
  90. {
  91. int i,v;
  92. if(u!=){
  93. f[u]=(f[fa]*cnt[u])%MOD*inv(n-cnt[u],MOD)%MOD;
  94. ans=(ans+f[u]*f[u]%MOD)%MOD;
  95. }
  96. for(i=;i<q[u].size();i++){
  97. if((v=q[u][i])==fa)continue;
  98. dfs2(v,u);
  99. }
  100. }
  101.  
  102. int main(){
  103. // freopen("in.txt","r",stdin);
  104. int i,j,a,b;
  105. fac[]=;
  106. for(i=;i<N;i++)fac[i]=(i*fac[i-])%MOD;
  107. for(i=;i<N;i++)rev[i]=inv(fac[i],MOD);
  108. scanf("%d",&T);
  109. while(T--)
  110. {
  111. scanf("%d",&n);
  112. for(i=;i<=n;i++)q[i].clear();
  113. for(i=;i<n;i++){
  114. scanf("%d%d",&a,&b);
  115. q[a].push_back(b);
  116. q[b].push_back(a);
  117. }
  118.  
  119. dfs1(,);
  120. ans=f[]*f[]%MOD;
  121. dfs2(,);
  122.  
  123. printf("%I64d\n",(ans+MOD)%MOD);
  124. }
  125. return ;
  126. }

HDU-4661 Message Passing 树形DP,排列组合的更多相关文章

  1. HDU 4661 Message Passing ( 树DP + 推公式 )

    参考了: http://www.cnblogs.com/zhsl/archive/2013/08/10/3250755.html http://blog.csdn.net/chaobaimingtia ...

  2. hdu 4661 Message Passing(木DP&amp;组合数学)

    Message Passing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  3. HDU 4661 Message Passing 【Tree】

    题意: 给一棵树,每一个结点都有一个信息,每一个时刻,某一对相邻的结点之间可以传递信息,那么存在一个最少的时间,使得所有的节点都可以拥有所有的信息.但是,题目不是求最短时间,而是求最短时间的情况下,有 ...

  4. 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas

    [题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...

  5. 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值

    [题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...

  6. G.subsequence 1(dp + 排列组合)

    subsequence 1 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 You are ...

  7. HDU 5816 状压DP&排列组合

    ---恢复内容开始--- Hearthstone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java ...

  8. 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)

    题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...

  9. 【noi 2.6_9288】&【hdu 1133】Buy the Ticket(DP / 排列组合 Catalan+高精度除法)

    题意:有m个人有一张50元的纸币,n个人有一张100元的纸币.他们要在一个原始存金为0元的售票处买一张50元的票,问一共有几种方案数. 解法:(学习了他人的推导后~) 1.Catalan数的应用7的变 ...

随机推荐

  1. Hiberante+jpa,注解生成32字符的Id

    @Id @GenericGenerator(name = "id-generator", strategy = "uuid") @GeneratedValue( ...

  2. Google protobuf安装

    1:需要安装sudo apt-get install x11-apps libwayland-ltst-client0 libtxc-dxtn-s2tc0 x11-session-utils  x11 ...

  3. STL算法

    STL算法部分主要由头文 件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<algorit ...

  4. .net speed up

    Ngen.exe http://www.cnblogs.com/yukaizhao/archive/2011/11/07/how-to-use-ugen.html Merge.exe Merge dl ...

  5. ADO.NET- 基础总结及实例介绍

    最近闲暇时间写的一些小程序中,访问数据库比较多:下面主要介绍下ADO.NET方面知识,有不足之处,希望大神们不吝赐教: 提到ADO.NET,经常会和ASP.NET进行混淆,两者的区别很大,没有可比性, ...

  6. hihocoder #1300 : 展胜地的鲤鱼旗 dp

    题目链接: http://hihocoder.com/problemset/problem/1300 题解: 先用栈预处理出每个‘)’匹配的‘(’的位子,放在pos数组中. dp[i]表示以i结尾的合 ...

  7. Tern Server Timeout

  8. github 中删除/更名版本库(repository)

    问题描述: github 中版本库创建/删除/更该名称 问题解决:            (1)创建版本库(Repository) 注:        在上图中的+按钮图标指示的是创建版本库的按钮 注 ...

  9. java文件操作(输出目录、查看磁盘符)

    问题描述:     java操作文件,所有硬盘中所有文件路径 问题解决:     (1)查看所有磁盘文件 注:     如上所示,使用接口 File.listRoots()可以返回所有磁盘文件,通过f ...

  10. javamail邮件发送报错解决方案

    如果你用myEclipse进行开发的话,运行时可能会出现以下的错误:Exception in thread "main" java.lang.NoClassDefFoundErro ...