分析:把题目换个方式理解,就是把各个点排成一列,并且指定了若干对的先后次序,问你有多少种序列满足要求.

   显然是一道dp题,直接推出方程似乎有点点困难,那么先看看数据特点.

1.有一些点满足fi=0,那么直接输出n!就可以了.

2.保证所有的关系是一条链.我们假设所有链的长度和为sum,链1的长度为l1,链2的长度为l2......

现在有sum个位置,我要把链1上的点按照次序放到sum个位置上,一共有C(sum,l1)种方案,接下来放链2,还有sum - l1个位置,所以有C(sum - l1,l2)种方案,以此类推......

3.保证构成一棵满二叉树.设f[i]表示以i为根的子树的方案数,那么f[i] =C(2s,s)*f[lc]*f[rc],其中s是左右子树的节点数.

下面考虑怎么将这些做法合并为正解的做法.可以先写出一个伪状态转移方程:f[i] = ∏ f[i.son] * i.son的排列方式。这个时候把链换成了子树,其实原理还是一样的.

然后因为要用除法取模,所以需要用到逆元,我们可以在求出阶乘的同时线性求出逆元和逆元的阶乘以便计算组合数.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = ,mod = 1e9+; int n,fa[maxn],head[maxn],nextt[maxn * ],to[maxn * ],tot = ,sizee[maxn];
long long ans,niyuan[maxn],jiecheng[maxn],nijie[maxn]; void add(int x, int y)
{
to[tot] = y;
nextt[tot] = head[x];
head[x] = tot++;
} long long C(int x, int y)
{
return jiecheng[y] * nijie[x] % mod * nijie[y - x] % mod;
} long long solve(int u)
{
if (sizee[u] == )
return ;
long long res = , sum = sizee[u] - ;
for (int i = head[u]; i; i = nextt[i])
{
int v = to[i];
res = res * C(sizee[v], sum) % mod;
res = res * solve(v) % mod;
sum -= sizee[v];
}
return res;
} void dfs(int u)
{
sizee[u] = ;
for (int i = head[u]; i; i = nextt[i])
{
int v = to[i];
dfs(v);
sizee[u] += sizee[v];
}
} int main()
{
scanf("%d", &n);
for (int i = ; i <= n; i++)
{
scanf("%d", &fa[i]);
add(fa[i], i);
}
jiecheng[] = ;
niyuan[] = ;
nijie[] = ;
nijie[] = ;//一定要赋值!
for (int i = ; i <= n; i++)
{
jiecheng[i] = (long long)jiecheng[i - ] * i % mod;
niyuan[i] = (long long)(mod - mod / i) * niyuan[mod % i] % mod;
nijie[i] = (long long)nijie[i - ] * niyuan[i] % mod;
}
dfs();
printf("%lld\n", solve()); return ;
}

常州模拟赛d7t1 亲戚的更多相关文章

  1. 常州模拟赛d4t1 立方体

    题目描述 立方体有 6 个面,每个面上有一只奶牛,每只奶牛都有一些干草.为了训练奶牛的合作精神,它 们在玩一个游戏,每轮:所有奶牛将自己的干草分成 4 等份,分给相邻的 4 个面上的奶牛. 游戏开始, ...

  2. 常州模拟赛d7t3 水管

    分析:第一问还是很好做的,关键是怎么做第二问.我们可以每次删掉最小生成树上的一条边,然后再求一次最小生成树,看边权和大小和原来的是不是一样的,不过这个做法效率很低. 考虑Kruskal算法的原理,每次 ...

  3. 常州模拟赛d6t3 噪音

    FJ有M个牛棚,编号1至M,刚开始所有牛棚都是空的.FJ有N头牛,编号1至N,这N头牛按照编号从小到大依次排队走进牛棚,每一天只有一头奶牛走进牛棚.第i头奶牛选择走进第p[i]个牛棚.由于奶牛是群体动 ...

  4. bzoj3743 [Coci2015]Kamp 常州模拟赛d6t2

    3743: [Coci2015]Kamp Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 484  Solved: 229[Submit][Status ...

  5. 常州模拟赛d5t2 mogician

    分析:一个暴力的思想是枚举g,然后枚举每个数ai,看能不能符合要求,这样复杂度是O(nA)的,直接T掉了.也没什么其他的办法了,在暴力的基础上优化一下,优化的关键是要如何快速统计出不满足要求的数的个数 ...

  6. 常州模拟赛d5t1 journalist

    分析:出题人丧心病狂卡spfa......只能用dijkstar+堆优化. 主要的难点是字典序的处理上,一个想法是在做最短路的时候处理,边松弛边记录,比个大小记录最佳答案.具体的思路大概和最短路计数差 ...

  7. 常州模拟赛d4t3 字符串划分

    题目描述 给你一串由小写字母组成的字符串,希望你把它划分成一些小段,使得每一小段字符串中的字母 都不相同,并且希望分的段数尽量少. 然后,把这些小段按字典序排序后输出,中间由一个空格分隔. 例如:字符 ...

  8. 常州模拟赛d4t2 陶陶摘苹果

    题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 n 个苹果.苹果成熟的时候,陶陶就会 跑去摘苹果. 陶陶的手不能弯 (他仅能把手伸直),当且仅当陶陶达到的高度与苹果的高度相等的时候,陶陶 ...

  9. 常州模拟赛d3t3 两只怪物心心相印

    题目背景 从前我是一位无名的旅人,旅途中我得到了某样东西:贤者之石.我因此得到悠久的时光和漂泊的生命.1897年冬天,我一时兴起舍弃了旅人的生活. 贤者之石创造出来的,是货真价实的黄金.我的名声传遍了 ...

随机推荐

  1. laravel 模型 $table $guarded $hidden

     首先以App\User模型为例 1.$table属性 表名,对应数据库中的表名 2.guarded)属性 guarded表示在create()方法中不能被赋值的字段 3.$hidden属性 $hid ...

  2. ASP.NET 知识点总结(七)

    1.new修饰符是起什么作用new 修饰符用于声明类或类的成员,表示隐藏了基类中同名的成员.而new 操作符用于实例化一个类型new 修饰符只能用于继承类,一般用于弥补基类设计的不足new 修饰符和 ...

  3. ZOJ-3960 What Kind of Friends Are You?

    What Kind of Friends Are You? Time Limit: 1 Second      Memory Limit: 65536 KB Japari Park is a larg ...

  4. 递推DP HDOJ 5389 Zero Escape

    题目传送门 /* 题意:把N个数分成两组,一组加起来是A,一组加起来是B,1<=A,B<=9,也可以全分到同一组.其中加是按照他给的规则加,就是一位一位加,超过一位数了再拆分成一位一位加. ...

  5. 构建一个.net的干货类库,以便于快速的开发 - 前言

    前言: 工作已经快两年了,项目也做过不少,不知道大家有没有一个习惯,就是把在做项目过程中那些好的方法记录下来.我觉得这个习惯在开发的过程中还是很有用的,举个例子,我之前做过一个支付宝的支付功能,然后把 ...

  6. Objective-C设计模式——桥接Bridge(接口适配)

    桥接模式 桥接模式就是让抽象和实现分离的最好体现,符合面向对象的依赖倒转原则.Abstruct抽象类负责设计客户端接口,Implementor则负责具体的细节逻辑. 在桥接模式中,Abstruct类持 ...

  7. 在C语言中模仿java的LinkedList集合的使用(不要错过哦)

    在C语言中,多个数据的储存通常会用到数组.但是C语言的数组有个缺陷,就是固定长度,超过数组的最大长度就会溢出.怎样实现N个数储存起来而不被溢出呢. 学过java的都知道,java.util包里有一个L ...

  8. 【C++】Item18. Make interfaces easy to use correctly and hard to use incorrectly

    接口容易被正确使用,不易被误用 c++简单工厂模式时,初级实现为ITest* CreateTestOld(), 然后用户负责释放返回的对象.如果忘记释放就会造成memory leak,所以在设计工厂接 ...

  9. Android开发——Snackbar使用详解

    http://blog.csdn.net/qq_19431333/article/details/52862348

  10. Matlab2014的下载和安装激活过程

    Matlab2014的下载和安装过程 转载自csdn  https://blog.csdn.net/hp910315/article/details/70197149 1 下载Matlab2014,下 ...