Description
【问题背景】
  教主LHX作为知名人物,时刻会有恐怖分子威胁他的生命。于是教主雇佣了一些保镖来保障他的人生安全。
【问题描述】
  教主一共雇佣了N个保镖,编号为1~N。每个保镖虽然身手敏捷武功高强,但是他在其余N-1个保镖里,都会有一个“上司”,他会对他的上司言听计从。但一号保镖例外,他武功盖世,不惧怕其余任何保镖,所以他没有上司。
  教主LHX会对这N个保镖进行定期视察。每次视察的时候,首先会让所有保镖排队。
对于每个保镖,在他心目中会对他的所有下属的武功实力排个队。
  现在教主要求排出来的队伍满足:①互为上司-下属的两个保镖,上司在前,下属在后 ②对于一个保镖的所有下属,武功实力较强的在前,较弱的在后。
  教主想知道,总的排队方法数除以10007的余数是多少。
Input
  输入的第一行为一个正整数T,表示了数据组数。
  对于每组数据:
  第一行为一个正整数N。
  接下来N行,每行描述一个保镖。
  第i+1行,会有一个整数K,代表第i个保镖的下属个数,接下来K个数,代表第i个保镖的下属按照武功实力从高到低的编号。
Output
  输出包括C行,每行对于每组数据输出方案数mod 10007后的结果。
Sample Input
2
5
2 2 3
2 4 5
0
0
0
7
2 2 3
2 4 5
2 6 7
0
0
0
0
Sample Output
3
10
Hint
【样例解释】
  对于第1组数据,有以下3种排列是合法的:
  1 2 4 3 5
  1 2 3 4 5
  1 2 4 5 3
  同时满足了1在2与3之前且2在3之前,2在4与5之前且4在5之前
【数据范围】
  对于20%的数据,有N ≤ 9;
  对于40%的数据,有对于所有K,有K ≤ 2;
  对于60%的数据,有N ≤ 100;
  对于100%的数据,有T ≤ 10,N ≤ 1000,K ≤ N。

看着是一棵多叉树,可是根据题意描述,按照排列顺序,可以发现恰好是儿子兄弟的二叉树表示法
(其实就是一个先决条件,就是必须把父亲排在前面)
然后转化成二叉树,拓扑方案数?因为这是在二叉树上,所以是可做的(如果是有向无环图,这个问题就是NP问题了,只能通过状压解决小规模数据)。
下面是推导过程:
设f[i]f[i]是i号子树的拓扑排序方案数。
l,rl,r分别是它的左右儿子。
根据乘法原理
f[i]=f[l]∗f[r]∗g(l,r)f[i]=f[l]*f[r]*g(l,r)
其中g(l,r)g(l,r)表示左右儿子拓扑序列合并的方案数
若s[i]s[i]表示以i为根的子树中的节点数。
则ll的拓扑序列长度为s[l]s[l]。
不妨设在l的拓扑序列中插入r的序列。
即在ll的s[l]+1s[l]+1的空位中插入。
因为r的序列顺序是固定的,我们只需考虑在每个位置的插入个数。
设在第一个空位插入x1x_1个数,…,在第n个空位插入xnx_n个数。
则有

∑i=1s[l]+1xi=s[r](x≥0)

\sum_{i=1}^{s[l]+1} x_i=s[r] \tag{$x\ge0$}
即 nn个非负整数相加等于mm
在两边加上 s[l]+1s[l]+1,变为

∑i=1s[l]+1xi=s[l]+s[r]+1(x≥1)

\sum_{i=1}^{s[l]+1} x_i=s[l]+s[r]+1\tag{$x\ge1$}
把 s[l]+s[r]+1s[l]+s[r]+1个“1”分成 s[l]+1s[l]+1份
,即 Cs[l](s[l]+s[r])C_{(s[l]+s[r])}^{s[l]}
即 g(l,r)=Cs[l](s[l]+s[r])g(l,r)=C_{(s[l]+s[r])}^{s[l]}
可得
f[i]=f[l]∗f[r]∗Cs[l](s[l]+s[r])f[i]=f[l]*f[r]*C_{(s[l]+s[r])}^{s[l]}

/*苍天负我笑,痴情待明朝*/
#include<algorithm>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<map>
#include<set>
#define mp makepair
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
typedef pair<int,int>pii;
const int Mod = 10007;
int n;
int to[1005],nex[1005],h[1005],cnt=0,size[1005];
ll F[1005];
void exgcd(int a,int b, int &x,int &y){if(b==0){x=1;y=0;return ;}else {exgcd(b,a%b,y,x);y-=x*(a/b);return;};
}
int C(int a,int b){int x,y,temp=1;for(int i=1;i<=b;i++){temp=(temp*(a-b+i))%Mod;exgcd(i,Mod,x,y);x=(x%Mod+Mod)%Mod;temp=(temp*x)%Mod;}return temp;
}
void dfs(int v){size[v]=1;F[v]=1;for(int i=h[v];i;i=nex[i]){dfs(to[i]);size[v]+=size[to[i]];F[v]=(F[v]*F[to[i]])%Mod;if(i!=h[v]){F[v]=(F[v]*C(size[v]-1,size[to[i]]))%Mod;}}}
int main(){int T;scanf("%d",&T);while(T--){int x,y;cnt=0;memset(h,0,sizeof(h));scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&x);int f=i;for(int j=1;j<=x;j++){scanf("%d",&y);cnt++;to[cnt]=y;nex[cnt]=h[f];h[f]=cnt;f=y;}}dfs(1);cout<<F[1]<<"\n";}return 0;
}

BSOJ 2927 -- 【模拟试题】保镖排队相关推荐

  1. 计算机网络技术期末考试模拟试题及答案

    计算机网络技术期末考试模拟试题及答案 一. 填空(每题0.5分,共10分) 1. 在采用电信号表达数据的系统中,数据有数字数据 和 模拟数据 两种. 2. 域名系统DNS是一个分布式数据库 系统. 3 ...

  2. 计算机网络技术期末考试2010模拟试题及答案

    计算机网络技术期末考试模拟试题及答案 一. 填空(每题0.5分,共10分) 1. 在采用电信号表达数据的系统中,数据有数字数据和  模拟   数据两种. 2. 域名系统DNS是一个    分布式数据库 ...

  3. 计算机考试批处理试题,2015计算机三级考试pc技术模拟试题及答案(八)

    2015计算机三级考试pc技术模拟试题及答案(八) 1.关于Windows 98中的网上邻居的相关叙,( )是错误的. A.通过网上邻居可以游览和使用网上的全部计算机资源 B.通过网上邻居可以浏览网上 ...

  4. 微型计算机组成原理考试,全国高等教育自学考试计算机组成原理模拟试题

    第一部分 选择题(共15分) 一.单项选择题(本大题共15小题,每小题1分,共15分.在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内.错选.多选或未选均无分.) 1. ...

  5. 计算机一级在线模拟试题,计算机一级模拟试题带答案

    计算机一级模拟试题带答案 计算机考试分为四个等级,不同等级的内容不同,那么百分网小编为大家提供的是关于计算机一级的模拟考试题,希望能为各位考生的复习提供帮助! 一.判断正误题,正确填A,错误填B(共2 ...

  6. 计算机一级考模拟试题,计算机一级MSOffice考前模拟试题「附答案」

    计算机一级MSOffice考前模拟试题「附答案」 一级分为DOS版和Windows版,考核应试者计算机基本知识和使用微机系统的初步能力.那么计算机一级MSOffice考试会怎么考?以下仅供参考! 1) ...

  7. 唐朔飞计算机组成原理pdf_唐朔飞计算机组成原理第2版配套题库名校考研真题课后答案资料课后习题章节题库模拟试题...

    唐朔飞<计算机组成原理>(第2版)配套题库[名校考研真题+课后习题+章节题库+模拟试题] 第一部分 名校考研真题 2015年全国硕士研究生入学统一考试计算机科学与技术学科联考计算机学科专业 ...

  8. 部队文职计算机试题,2020军队文职人员考试:计算机基础模拟试题(1)

    [导语]2020年军队文职备考进行中,为助力各位考生做好2020年军队文职招聘考试准备,山东中公教育小编为大家整理了考试题库:2020军队文职人员考试:计算机基础模拟试题(1),供大家学习和参考. 1 ...

  9. 计算机一级考试试题 文明,XP计算机文明基础模拟试题库1.doc

    XP计算机文明基础模拟试题库1 XP版计算机文化基础试题库 序号题目答案面向特定专业应用领域(如图形.图像处理等)使用的计算机一般是( ) A.A.D在有关计算机软件.程序.文档的描述中,下面不正确的 ...

  10. 固定在计算机主机箱体上,联结计算机各种部件,起桥梁作用的是,2014年12月计算机应用基础模拟试题...

    2014年12月份计算机应用基础统考模拟试题 一.单项选择题 1. 世界上第一台电子数字计算机采用的电子器件是(c ) A.大规模集成电路 B 集成电路 C 晶体管 D 电子管 2.下列说法中,正确的 ...

最新文章

  1. RubyGems 库发现了后门版本的网站开发工具 bootstrap-sass
  2. 用友服务器整体迁移--数据库附加
  3. 【转】 Android新特性介绍,ConstraintLayout完全解析
  4. SCI论文的时态、主动语句和被动语句总结
  5. hdoj 2022 海选女主角
  6. Git 查看并修改 name 和 email
  7. LiveWallPaper 让您的壁纸动起来 连载(三)——OpenGL ES特辑
  8. java easyui分页源码_SpringMVC+easyUI中datagrid分页实现_2014.5.1
  9. 2017级面向对象程序设计——团队作业2
  10. 剑指offer例题分享--7
  11. get 和 post 区别
  12. 2017北航计算机系学硕最低录取分,2018北航计算机考研初试经验帖
  13. java设置excel自动调整行高_Java 设置Excel自适应行高、列宽
  14. ae合成设置快捷键_【实用向】AE必备小技巧
  15. 魔域单机服务器显示read,魔域boss点,单机假设相关信息(Demon boss point, single machine assumes relevant information).doc...
  16. 【打一局王者荣耀掉星的时间,我制作了一款支持 重力感应 的 3D动态壁纸】
  17. 【2020牛客多校】第九场 K The Flee Plan of Groundhog——BFS
  18. pdf签名无效解决办法_为什么下载下来的电子合同提示有效性未知或至少一个签名有问题?...
  19. 使用PyQt绘制精美的股票行情分时线图
  20. 电脑远程设置的方法 电脑远程的用户名和密码怎么设置

热门文章

  1. mysql设置59分59秒会自动加一秒
  2. PHP 报错 Resource temporarily unavailable 无法删除上传的资源
  3. 开机自动启动QQ和微信,怎样设置取消
  4. Windows桌面图标缓存
  5. Leetcode 684. 冗余连接(dsu,氵)
  6. win7您无权关闭计算机,win7不能关机的解决方法
  7. 吃透String的intern方法
  8. 【旧文章搬运】暴力的查进程方法
  9. php 缩略图黑图,一睡万年_119 黑图(上) - 小说者
  10. C++ 全排列 123456789 1 2 3