1382 - The Queue
Time Limit: 2 second(s) | Memory Limit: 32 MB |
On some special occasions Nadia's company provide very special lunch for all employees of the company. Before the food is served all of the employees must stand in a queue in front of the food counter. The company applied a rule for standing in the queue. The rule is nobody can stand anywhere in front of his supervisor in the queue. For example, if Abul is the supervisor of Babul and Abul stands in kth position from the front of the queue, then Babul cannot stand at any position in between 1 and k - 1 from front of the queue.
The company has N employees and each of them has exactly one supervisor except one (CEO) who doesn't have any supervisor.
You have to calculate in how many ways the queue can be created. For this problem, you can safely assume that in at least one way the queue can be created.
Input
Input starts with an integer T (≤ 700), denoting the number of test cases.
Each case starts with a line containing an integer N (1 ≤ N ≤ 1000). Each of the following N - 1 lines will contain two integers a and b (1 ≤ a, b ≤ N, a ≠ b), which denotes that a is the supervisor of b. For the sake of simplicity we are representing each employee by an integer number. Assume that the given input follows the restrictions stated above.
Output
For each case, print the case number and the number of ways to create the queue. The result can be large, print the result modulo 1000 000 007.
Sample Input |
Output for Sample Input |
1 5 2 1 2 3 3 4 3 5 |
Case 1: 8 |
1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<queue>
6 #include<stack>
7 #include<vector>
8 using namespace std;
9 typedef long long LL;
10 const int N=1e9+7;
11 vector<int>vec[1100];
12 queue<int>que;
13 int ans[2100];
14 LL dp[1100];
15 LL cnt[1100];
16 LL ju[1100][1100];
17 void dfs(int n);
18 int main(void)
19 {
20 int k,i,j;
21 ju[0][0]=1;
22 ju[1][0]=1;
23 ju[1][1]=1;
24 for(i=2; i<=1099; i++)
25 {
26 for(j=0; j<=i; j++)
27 {
28 if(i==j||j==0)
29 ju[i][j]=1;
30 else ju[i][j]=(ju[i-1][j]+ju[i-1][j-1])%N;
31 }
32 }
33 scanf("%d",&k);
34 int s;
35 int n,m;
36 int x,y;
37 for(s=1; s<=k; s++)
38 {
39 for(i=0; i<1050; i++)
40 {
41 dp[i]=1;
42 vec[i].clear();
43 }
44 scanf("%d",&n);
45 for(i=1; i<=n; i++)
46 cnt[i]=i;
47 for(i=1; i<n; i++)
48 {
49 scanf("%d %d",&x,&y);
50 vec[x].push_back(y);
51 cnt[y]=x;
52 }
53 int id=1;
54 memset(ans,0,sizeof(ans));
55 for(i=1; i<=n; i++)
56 {
57 if(cnt[i]==i)
58 id=i;
59 }
60 memset(ans,0,sizeof(ans));
61 dfs(id);
62 printf("Case %d: ",s);
63 printf("%lld\n",dp[id]);
64 }
65 return 0;
66 }
67 void dfs(int n)
68 {
69 if(!vec[n].size())
70 {
71 ans[n]=1;
72 dp[n]=1;
73 return ;
74 }
75 int cc=vec[n].size();
76 int i,j;
77 LL ak=0;
78 ans[n]+=1;
79 for(i=0; i<vec[n].size(); i++)
80 {
81 dfs(vec[n][i]);
82 ans[n]+=ans[vec[n][i]];
83 dp[n]=(dp[vec[n][i]]*dp[n]%N)*(ju[ans[n]-1][ans[vec[n][i]]])%N ;
84 }
85 }
1382 - The Queue的更多相关文章
- lightoj 1382 - The Queue(树形dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1382 题解:简单的树形dp加上组合数学. #include <iostr ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- Azure Queue Storage 基本用法 -- Azure Storage 之 Queue
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure File Storage 基 ...
- C++ std::queue
std::queue template <class T, class Container = deque<T> > class queue; FIFO queue queue ...
- 初识Message Queue之--基础篇
之前我在项目中要用到消息队列相关的技术时,一直让Redis兼职消息队列功能,一个偶然的机会接触到了MSMQ消息队列.秉着技术还是专业的好为原则,对MSMQ进行了学习,以下是我个人的学习笔记. 一.什么 ...
- 搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接
我们知道rabbitmq是一个专业的MQ产品,而且它也是一个严格遵守AMQP协议的玩意,但是要想骚,一定需要拿出高可用的东西出来,这不本篇就跟大家说 一下cluster的概念,rabbitmq是erl ...
- PriorityQueue和Queue的一种变体的实现
队列和优先队列是我们十分熟悉的数据结构.提供了所谓的“先进先出”功能,优先队列则按照某种规则“先进先出”.但是他们都没有提供:“固定大小的队列”和“固定大小的优先队列”的功能. 比如我们要实现:记录按 ...
- C#基础---Queue(队列)的应用
Queue队列,特性先进先出. 在一些项目中我们会遇到对一些数据的Check,如果数据不符合条件将会把不通过的信息返回到界面.但是对于有的数据可能会Check很多条件,如果一个数据一旦很多条件不 ...
- [LeetCode] Queue Reconstruction by Height 根据高度重建队列
Suppose you have a random list of people standing in a queue. Each person is described by a pair of ...
随机推荐
- 8种Vue中数据更新了但页面没有更新的情况
目录 1.Vue 无法检测实例被创建时不存在于 data 中的 属性 2. Vue 无法检测'对象属性'的添加或移除 3.Vue 不能检测利用数组索引直接修改一个数组项 4.Vue 不能监测直接修改数 ...
- Java 读取txt文件生成Word文档
本文将以Java程序代码为例介绍如何读取txt文件中的内容,生成Word文档.在编辑代码前,可参考如下代码环境进行配置: IntelliJ IDEA Free Spire.Doc for Java T ...
- SonarQube的部分规则探讨
引言:为了更好的使项目代码规范化,减少Bug的出现,因此最近引入了SonarQube来帮助检测代码问题,这里就分享部分有趣的规则. 注:因为保密原则,文章贴出来的代码都是我按照格式仿写的,并非公司源码 ...
- 【NetCore】RabbitMQ 封装
RabbitMQ 封装 代码 https://gitee.com/wosperry/wosperry-rabbit-mqtest/tree/master 参考Abp事件总线的用法,对拷贝的Demo进行 ...
- KMP算法思路
题目 给定一个字符串\(S\),求\(M\)字符串是否是\(S\)字符串中的子串.如果是,返回\(M\)对应\(S\)的第一个下标,否则返回-1. 例如:S串为a b c d a b c d a b ...
- 商业爬虫学习笔记day3
一. 付费代理发送请求的两种方式 第一种方式: (1)代理ip,形式如下: money_proxy = {"http":"username:pwd@192.168.12. ...
- windows Visual Studio 上安装 CUDA【转载】
原文 : http://blog.csdn.net/augusdi/article/details/12527497 前提安装: Visual Studio 2012 Visual Assist X ...
- Oracle—merge into语法
oracle的merge into语法,在这种情况下: 基于某些字段,存在就更新,不存在就插入: 不需要先去判断一下记录是否存在,直接使用merge into merge into 语法: MERGE ...
- linux下怎么查看某个命令属于哪个包
# yum whatprovides */ip 或者 # yum provides */ip 即可
- Linux环境下为普通用户添加sudo权限
系统环境:Centos6.5 1.背景: sudo是Linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部root命令的一个工具.Linux系统下,为了安全,一般来说我们操作都是在普通用户 ...