亲戚(relative)
【题目背景】
Y 家是世界上最大的家族,HJZ 是其中一员。
现在 Y 家人想要拍一张全家福,却发现这是一个十分复杂的问题. . . . . .
【题目描述】
Y 家一共有 n 人
其中每个人最多有一个直系祖先。
Y 家的家规十分严格,在拍全家福时每个人必须排在其直系祖先后面。如 HZY 不
可以排在 HJZ 前面,但 Little_Meat_Circle 就可以排在 HJZ 前。
现在 HJZ 想知道可以有多少种合法的排队方案。你只需要给出方案数对 109 + 7 取模的结果。
【输入格式】
从文件 relative.in 中读入数据。
第一行一个正整数 n 表示 Y 家的人数。
第二行 n 个整数 fi 表示第 i 个人的直系祖先编号。若 fi = 0 则表示第 i 个人没有 直系祖先。保证 fi , i 。
【输出格式】
输出到文件 relative.out 中。
一行一个整数,表示合法的方案数对 109 + 7 取模的结果。
【样例 1 输入】
4
0 1 1 0
【样例 1 输出】
8
题解:
首先,一个节点在以它为根的子树的方案中必为第一位
所以以它为根的子树的方案等于:
将所有子节点对应的子树的序列混合起来的方案数
因为序列顺序不能改变,所以可以变成组合问题
假设一个子树对应的序列a长为x,一个子树对应的序列b长为y,组成一个x+y的序列
所以方案数为:从x+y个位置中选x个(或y个)=>C(x+y,x)
因为这只是一对序列的方案,所以要乘f[a]*f[b]
这里f[x]是指x点的子树的方案数
在多叉树中,分叉可能大于2,这没有关系
先算出两个儿子的值,合并起来,记下合并后的方案数和大小,作为一个节点与下一个儿子合并
sum=(sum*f[v])*(C(tmp,p)) (p是子树大小,tmp是当前大小+p,sum是当前方案数)
最后f[x]=sum;
下一个问题,这个过程已经是O(n)了,求组合数如果O(n)会超时
方法是:
C(n,r)=n!/((n-r)!*r!)
n!用O(n)预处理,分母就用递推式
A[i]=(Mod-Mod/i)*A[Mod%i]%Mod
在O(n)时间内求出阶乘逆元
组合数就可以O(1)搞定了
总复杂度为O(n)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 struct Node 8 { 9 int next,to; 10 }edge[400001]; 11 int head[200001],Mod=1000000007,n,num; 12 long long f[200001],A[200001],B[200001]; 13 void add(int u,int v) 14 { 15 num++; 16 edge[num].next=head[u]; 17 head[u]=num; 18 edge[num].to=v; 19 } 20 long long C(int x,int r) 21 { 22 if (x==r) return 1; 23 if (r==0) return 1; 24 long long s=B[x]; 25 s=(s*A[x-r])%Mod; 26 s=(s*A[r])%Mod; 27 //cout<<x<<' '<<r<<' '<<s<<endl; 28 return s; 29 } 30 int dfs(int x,int pa) 31 {int i,p; 32 int tmp=0; 33 long long sum=1; 34 for (i=head[x];i;i=edge[i].next) 35 { 36 int v=edge[i].to; 37 if (v!=pa) 38 { 39 p=dfs(v,x); 40 //cout<<v<<' '<<f[v]<<' '<<p<<endl; 41 tmp+=p; 42 sum=(((sum*f[v])%Mod)*C(tmp,p))%Mod; 43 } 44 } 45 f[x]=sum; 46 //cout<<sum<<' '<<x<<endl; 47 return tmp+1; 48 } 49 int main() 50 {int i,x,j; 51 //freopen("relative.in","r",stdin); 52 //freopen("relative.out","w",stdout); 53 cin>>n; 54 for (i=1;i<=n;i++) 55 { 56 scanf("%d",&x); 57 add(x,i); 58 } 59 B[0]=1; 60 for (i=1;i<=n;i++) 61 B[i]=(B[i-1]*i)%Mod; 62 A[1]=1; 63 for (i=2;i<=n;i++) 64 A[i]=((Mod-(Mod/i))*(long long)A[Mod%i])%Mod; 65 for (i=2;i<=n;i++) 66 A[i]=(A[i]*A[i-1])%Mod; 67 dfs(0,0); 68 cout<<f[0]; 69 }
转载于:https://www.cnblogs.com/Y-E-T-I/p/7382919.html
亲戚(relative)相关推荐
- 考研英语不熟悉的词义(List1-List5)
文章目录 考研英语不熟悉的词义(List1-List5) List 1(46个) List 2(45个) List 3(51个) List 4(55个) List 5(52个) 考研英语不熟悉的词义( ...
- AB级 考试高频词 1000个
AB级 考试高频词 1000个 1 能力 ability 46 申请 application 91 街区 block 2 在船上 aboard 47 欣赏;感激 appreciate 92 女衬衫 b ...
- 亲戚B (普通并查集)
描述 或许你并不知道,你的某个朋友是你的亲戚.他可能是你的曾祖父的外公的女婿的外甥女的表姐的孙子.如果能得到完整的家谱,判断两个人是否是亲戚应该是可行的,但如果两个人的最近公共祖先与他们相隔好几代,使 ...
- 【每日一题】P1551 亲戚
文章目录 前言 题目描述 输入格式 输出格式 输入输出样例 解题思路 AC代码 总结 前言 坚持每天做一道算法题,每天学一点数据结构与算法,写思路和题解来加深自己的印象. P1551 亲戚 题目描述 ...
- 并查集专题(亲戚,格子游戏,银河英雄传说)
文章目录 序言 正文 亲戚 时间限制: 1000 ms 空间限制: 262144 KB 题目描述 输入 输出 样例输入 样例输出 讲解 Wrong Answer Code Accepted Code ...
- CSS中position属性( absolute | relative | static | fixed )详解
我们先来看看CSS3 Api中对position属性的相关定义: static:无特殊定位,对象遵循正常文档流.top,right,bottom,left等属性不会被应用. relative:对象遵循 ...
- Python实战 | 送亲戚,送长辈,月饼可视化大屏来帮忙!
中秋节介绍 中秋节,又称祭月节.月光诞.月夕.秋节.仲秋节.拜月节.月娘节.月亮节.团圆节等,是中国民间的传统节日. 中秋节自古便有祭月.赏月.吃月饼.玩花灯.赏桂花.饮桂花酒等民俗,流传至今,经久不 ...
- 如何向亲戚们解释人工智能可以干啥?
今年的春节,面对七大姑八大姨的关(pan)心(wen),你准备好应对的说辞了吗? 这场一年一度的开卷考试总能把一大批青年搞的"焦头烂额",而考题中最常见,杀伤力也最大的莫过于&qu ...
- 某程序员感叹:本是家族边缘人,但亲戚得知自己年入二百万后,都上来巴结!...
春节过年回家总会发生各种奇葩事,一位程序员就遇到了这样一件事: 本来已经快成为家族边缘人了,今年过年时,有人把他年入二百多万的事情传出去了.聚会的时候,一帮不熟的亲戚过来打听他的工作,顺便巴结他,吃饭 ...
最新文章
- struts2学习笔记--线程安全问题小结
- UniCode 速查表
- 使用命令创建mysql_用命令创建MySQL数据库
- 腾讯 Web UI 解决方案 QMUI Web —— 探索与沉淀
- 以往计算机二级c语言填空题,计算机二级C语言考试填空题精选4
- vscode怎么设置默认浏览器?(不成功)
- Flask实战----做了一个简易版CSDN
- 笔记-项目风险管理-复习要点
- 调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别...
- 前端学习(1916)vue之电商管理系统电商系统之绘制面包屑导航和卡片视图
- 用juniversalchardet解决爬虫乱码问题
- 中国团队屠榜:COCOMapillary挑战赛包揽全部冠军
- STM32:GPIO的8种输入输出模式深入详解
- WCF服务运行找不到X.509证书解决方案
- WIFI密码破解笔记
- 计算机随机抽样的方法有,卫生统计学四种随机抽样方法
- 19讲项目实战站内搜索页
- C语言可变参数问题(va_list,va_start,va_arg,va_end用法及定义)
- DragonBoard 高通推出 IoT板 hitting raspberry pi
- 【UVM基础】仿真时间与运行时间
热门文章
- 产品经理如何营销自己
- SpringCloud五大神兽之Eureka服务注册(三)——Eureka的自我保护
- 道与术 渠道以及通信方式的架构设计
- ibm是被联想收购了吗_联想收购IBM之后为什么出现品牌危机
- 我的世界服务器成就系统的其他成就是什么,大量的成就奖励亟待领取!《我的世界》【PC版】Hypixel服务器成就系统来啦~...
- 在64位的Linux系统使用gcc的-m32选项编译32位的程序得到了多余的代码(多余指令call和add)、有多余的.text.__x86.get_pc_thunk.ax
- MVC 架构解析 - 模型(Model)篇
- spring框架多数据源切换问题的解决
- java小时钟实验报告_JAVA实验报告(运用JavaFx实现时钟动画).doc
- 《Dead Cells》,通过3D工具制作2D动画