亲戚(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)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
struct Node
{
int next,to;
}edge[];
int head[],Mod=,n,num;
long long f[],A[],B[];
void add(int u,int v)
{
num++;
edge[num].next=head[u];
head[u]=num;
edge[num].to=v;
}
long long C(int x,int r)
{
if (x==r) return ;
if (r==) return ;
long long s=B[x];
s=(s*A[x-r])%Mod;
s=(s*A[r])%Mod;
//cout<<x<<' '<<r<<' '<<s<<endl;
return s;
}
int dfs(int x,int pa)
{int i,p;
int tmp=;
long long sum=;
for (i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if (v!=pa)
{
p=dfs(v,x);
//cout<<v<<' '<<f[v]<<' '<<p<<endl;
tmp+=p;
sum=(((sum*f[v])%Mod)*C(tmp,p))%Mod;
}
}
f[x]=sum;
//cout<<sum<<' '<<x<<endl;
return tmp+;
}
int main()
{int i,x,j;
//freopen("relative.in","r",stdin);
//freopen("relative.out","w",stdout);
cin>>n;
for (i=;i<=n;i++)
{
scanf("%d",&x);
add(x,i);
}
B[]=;
for (i=;i<=n;i++)
B[i]=(B[i-]*i)%Mod;
A[]=;
for (i=;i<=n;i++)
A[i]=((Mod-(Mod/i))*(long long)A[Mod%i])%Mod;
for (i=;i<=n;i++)
A[i]=(A[i]*A[i-])%Mod;
dfs(,);
cout<<f[];
}
亲戚(relative)的更多相关文章
- 入门OJ:亲戚
题目描述 或许你并不知道,你的某个朋友是你的亲戚.他可能是你的曾祖父的外公的女婿的外甥女的表姐的孙子.如果能得到完整的家谱,判断两个人是否亲戚应该是可行的,但如果两个人的最近公共祖先与他们相隔好几代, ...
- “fixed+relative==absolute”——对BFC的再次思考
好久没写博客了,刚好今天跨年夜没约到什么妹子,在家宅着不如写点东西好了. 需求 昨天晚上,给公司年会做一个移动端的投票页面,遇到一个UI优化的问题: · 正文内容少于一屏时,投票提交按钮固定显示在页面 ...
- Position属性四个值:static、fixed、relative、absolute的区别和用法
1.static(静态定位):默认值.没有定位,元素出现在正常的文档流中(如果设置 top, bottom, left, right, z-index这些属性就不起做作了). 2.relative(相 ...
- css的relative和position探究
在CSS中,Position 属性经常会用到,主要是绝对定位和相对定位,简单的使用都没有问题,尤其嵌套起来,就会有些混乱,今记录总结一下,防止久而忘之. CSS position 属性值: absol ...
- Position属性四个值:static、fixed、absolute和relative的区别和用法
Position属性四个值:static.fixed.absolute和relative的区别和用法 在用CSS+DIV进行布局的时候,一直对position的四个属性值relative,absolu ...
- (App.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
(App.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/MainPage.xaml", UriKi ...
- 辨析relative与absolute
谈起它们,想必大家都不陌生.relative,相对定位嘛:absolute,绝对定位嘛.但是它们到底是个啥东东呢? 看看w3c的定义,见下表 定位 含义 relative 元素框偏移某个距离.元素仍保 ...
- 家族/亲戚(relation)
题目描述 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是 ...
- td在relative模式下,IE9不显示border
方法一 .thisTd { background-clip: padding-box; position:relative; } 方法二 .thisTd { z-index=-1; ...
随机推荐
- alpha-咸鱼冲刺day7(后续一波)-紫仪
总汇链接 一,合照 emmmmm.自然还是没有的. 二,项目燃尽图 三,项目进展 正在写登陆+注册ing 注册搞出来了!!!!!!!!QAQ(喜极而泣!!!!.jpg) 四,问题困难 数据流程大概是搞 ...
- 2017-2018-1 20155306 《信息安全系统设计基础》Mybash的实现
2017-2018-1 20155306 <信息安全系统设计基础>Mybash的实现 要求: 使用fork,exec,wait实现mybash 写出伪代码,产品代码和测试代码 发表知识理解 ...
- 【审核】检查iOS项目中是否使用了IDFA
(1)什么是IDFA 关于IDFA,在提交应用到App Store时,iTunes Connect有如下说明: 这里说到检查项目中是否包含IDFA,那如何来对iOS项目(包括第三方SDK)检查是否包含 ...
- 20145237 《Java程序设计》第2周学习总结
教材学习内容总结 本周我学习了java的基础语法.分为类型.变量与运算符,流程控制. 一.类型:1.Java可以区分为基本类型和类类型.类类型也称作参考类型.2.Java中基本类型主要是整数.字节.浮 ...
- 关于搭建MyBatis框架(二)
由于在[关于使用Mybatis的使用说明(一)http://www.cnblogs.com/zdb292034/p/8675766.html]中存在不太完善地方,通过此片文档进行修订: 阅读指南:(1 ...
- JAVA_SE基础——34.static修饰成员变量
需求:描述一下学校的学生. 特点:都是中国人.... 测试代码1: class Student{ String name; String country = "中国"; //国籍 ...
- 深入理解java的static关键字
static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列 ...
- Centos6.7下面配置vim及其插件
Vim是在vi的基础上升级而来的,比vi更强大,提供代码补全,编译功能 [4]vim Vim是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用 ...
- Linux入门(1)_VMware和系统分区和系统安装和远程登陆管理
1 VMware的安装和使用 注意有 快照 和 克隆 的功能. 快照相当于建立一个 系统还原点, 可以随时恢复到原来状态. 克隆功能可以复制一个和当前一样的系统,并可以选择链接安装,只使用很少的空间就 ...
- Mego(03) - ORM框架的新选择
前言 从之前的两遍文章可以看出ORM的现状. Mego(01) - NET中主流ORM框架性能对比 Mego(02) - NET主流ORM框架分析 首先我们先谈下一个我们希望的ORM框架是什么样子的: ...