Uva11174:

村民排队:村子里现在有n(1≤n≤40000)个人,有多少种方式可以把它们排成一列,使得没有人站在他父亲的前面(有些人的父亲可能不在村子里)?输入n和每个人的父亲编号,输出方案总数除以1000000007的余数。

分析:首先我们应该能够看到的是,这种有关家庭关系的图,需要借助基本的一个数据结构——树,但是这里由于各个祖先不同,会形成森林,但是为了更好处理,我们将森林中的根节点的上面构造一个虚拟根,记作v0,这样就形成了一棵树。

我们设f[i]是以节点vi为根,得到的排列情况书,即f[0]就是这道题目的答案。

那么我们现在来考察f[0]究竟怎么计算,这里用到基本的计数原理。我们假设虚拟根v0下有k个儿子v1、v2、v3…vk,相当于有k个家族,则我们可以通过如下的步骤得到f[0]:

(i)                 我们将每个家族的人视为一样的元素.

(ii)               得到排列数之后再乘上这个家族符合要求的排列数.

这里记s[i]是第i个家族的人数,也就是说以vi为根的所有节点的和(包括vi自己),那么完成第一个步骤,我们得到的方法数是

而完成第二个步骤,结合分步乘法原理,应该是如下的式子:

这样我们便得到了一个关于f[n]的递推式,如下:

其中k是v0的儿子个数,如果我们设置一个数组son[i]记录vi的儿子儿子数,ci表示节点的i个儿子在树结构中的序号,因此我们会得到更加具有普遍性的递推式子:

那么现在将②迭代到①当中,会发现一直递推下去,再考虑对于叶节点vj,有f[j]  = 1,因此我们能够得到如下的线性表达式:

那么基于这个线性表达式,接下来我们需要考虑的事情就很明了了:

问题一:如何基于树结构找到s[i]呢,这是最基本的数据结构的问题。

问题二:题目要求输出f[0] % mod,而根据数论当中同余运算的性质,涉及出发应该借助逆元,而结合mod的大小和s[i]的取值,有gcd(mod , s[i]),我们也是能够得到s[i]在关于mod下一定存在逆元的。

总结一下,这道题目还是一道非常好的题目的,它涉及了组合计数的基本原理、递推、整理数学公式、基本树形数据结构和数论当中的逆元,是一道非常综合的题目。这里笔者由于临近考试周时间紧张的原因,在如何编码实现计算s[i]和求解逆元上先不做讨论,以后有时间了再补充。

转载于:https://www.cnblogs.com/rhythmic/p/5576567.html

《训练指南》——6.10相关推荐

  1. 训练指南第二章-基础问题

    训练指南第二章-基础问题 P170 2 / 4 Problem A UVA 10943 How do you add? 1 / 2 Problem B UVA 10780 Again Prime? N ...

  2. 算法竞赛训练指南代码仓库_数据仓库综合指南

    算法竞赛训练指南代码仓库 重点 (Top highlight) As a data scientist, it's valuable to have some idea of fundamental ...

  3. 一根绳子从一头烧需30时分钟_小学生一分钟跳绳满分训练指南

    小学生一分钟跳绳测试项目是体育老师和众多家庭的痛,大多数的孩子1分钟跳不到60个.而跳绳又是体质健康测试里占分比较高的一个项目,所以很多宝妈/宝爸们很是焦虑.因此,我们根据平时儿童跳绳训练的经验和网上 ...

  4. 算法竞赛入门经典训练指南

    最近在看算法竞赛入门经典训练指南这本书,书中不错的算法我将在博客中发布,和大家共同学习. 题目: 在你的王国里有一条n个头的恶龙,你希望雇一些骑士把它杀死(即砍掉所有头).村里有m个骑士可以雇佣,一个 ...

  5. 《算法竞赛入门经典——训练指南》第一章相关内容

    #<算法竞赛入门经典--训练指南>第一章相关内容 希望各位大牛能指导! 红色为已经做了的...黄色背景是还有不懂地方,希望在年前能刷完第一章啊.... 更新版.google上貌似又加了ex ...

  6. 算法竞赛入门经典——训练指南

    <算法竞赛入门经典--训练指南> 基本信息 作者: 刘汝佳 陈锋 [作译者介绍] 丛书名: 算法艺术与信息学竞赛 出版社:清华大学出版社 ISBN:9787302291077 上架时间:2 ...

  7. TensorFlow 网络模型移植和训练指南

    TensorFlow 网络模型移植和训练指南(持续更新) 1.限制 tensorflow只兼容tensorflow1.15 3.网络迁移 3.1 使用 Estimator 迁移 关于估算器 Estim ...

  8. UVa 11549 Calculator Conundrum (训练指南,Floyd 判圈算法)

    算法竞赛训练指南, 42 页 注意: 1. 用数组来记录一个数的各位的数字 2. 快慢指针来记录链表环的入点(Floyd 判圈算法) #include <cstdio> #include ...

  9. 【LA3523 训练指南】圆桌骑士 【双连通分量】

    题意 有n个骑士经常举行圆桌会议,商讨大事.每次圆桌会议至少应有3个骑士参加,且相互憎恨的骑士不能坐在圆桌旁的相邻位置.如果发生意见分歧,则需要举手表决,因此参加会议的骑士数目必须是奇数,以防赞同和反 ...

  10. 胡凡 《算法笔记》 上机实战训练指南 3.1 简单模拟

    胡凡 <算法笔记> 上机实战训练指南 3.1 持续更新中 , 菜鸡的刷题笔记- 大学到现在了还没咋好好刷过题,该push自己了- 文章目录 胡凡 <算法笔记> 上机实战训练指南 ...

最新文章

  1. UI设计学习的对比原则怎么运用?
  2. java 生成parquet文件格式,使用Java API将Parquet格式写入HDFS,而不使用Avro和MR
  3. java static成员变量方法和非static成员变量方法的区别 ( 二 )
  4. const类型限定符
  5. Linux安装phpMyAdmin详细步骤
  6. 计算机网络作业答案吴,中国大学《2020春季课程-计算机网络应用吴迪》答案全部2020高校邦《羽毛球》作业题库答案...
  7. 函数对象 函数嵌套 名称空间与作用域
  8. 线性表顺序表---逆置所有元素
  9. java x509certificate2_ASP.NET使用X509Certificate2出现一系列问题的解决方法
  10. 倍增LCA(bzoj 3732: Network)
  11. navicat超时未激活如何处理?
  12. 第七章第二节 弹力学案
  13. 葫芦兄弟java7723_雪人兄弟(官方正版)
  14. 制造业升级:老调年年弹
  15. php大写数字转换,php如何实现数字金额转换大写金额(代码示例)
  16. 指纹识别技术综述(扫盲篇)(转载)
  17. fluent柱坐标系设定_Fluent中速度入口条件要设置哪些参数
  18. Java设计模式----创建者模式
  19. 数据库原理及MySQL应用 | 数据库安全加固
  20. Linux下的文本编辑器和Windows的编辑器

热门文章

  1. android 之 Hnadler 、Message 、Looper
  2. 杭电1018 Big Number
  3. Jquery给基本控件的取值、赋值
  4. 利用JS调用aspx页面(转载)
  5. s5-15 开放的最短路径优先_OSPF
  6. 晓曼机器人能恢复出厂设置吗_手机出毛病了就恢复出厂设置,会损伤手机吗?影响有多大呢...
  7. python中的sort,sorted
  8. Flink 助力美团数仓增量生产的应用实践
  9. python34.dll_python34.dll下载|python34.dll下载官方版【32位|64位】-太平洋下载中心
  10. 把数据保存到cook_JavaScript数据存储 Cookie篇