lightoj 1382 - The Queue(树形dp)
2024-08-31 11:01:31
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1382
题解:简单的树形dp加上组合数学。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#define mod 1000000007
using namespace std;
typedef long long ll;
const int M = ;
ll dp[M] , C[M][M];
int fa[M] , num[M];
vector<int> vc[M];
void find_num(int u , int pre) {
num[u] = ;
int len = vc[u].size();
for(int i = ; i < len ; i++) {
int v = vc[u][i];
if(v == pre) continue;
find_num(v , u);
num[u] += num[v];
}
}
void dfs(int u , int pre) {
int len = vc[u].size();
ll ans = , sum = num[u];
for(int i = ; i < len ; i++) {
int v = vc[u][i];
if(v == pre) continue;
dfs(v , u);
ans *= (C[sum - ][num[v]] * dp[v]) % mod;
ans %= mod;
sum -= num[v];
}
dp[u] = ans;
dp[u] %= mod;
}
int main() {
int t , n;
int Case = ;
scanf("%d" , &t);
C[][] = ;
for(int i = ; i <= M - ; i++) {
C[i][] = ;
for(int j = ; j <= i ; j++)
C[i][j] = (C[i - ][j - ] + C[i - ][j]) % mod;
}
while(t--) {
scanf("%d" , &n);
for(int i = ; i <= n ; i++) {
vc[i].clear();
dp[i] = ;
fa[i] = -;
num[i] = ;
}
for(int i = ; i < n - ; i++) {
int u , v;
scanf("%d%d" , &u , &v);
vc[u].push_back(v);
fa[v] = u;
}
int root = ;
for(int i = ; i <= n ; i++) {
if(fa[i] == -) {
root = i;
break;
}
}
find_num(root , -);
dfs(root , -);
printf("Case %d: %lld\n" , ++Case , dp[root] % mod);
}
return ;
}
最新文章
- 如何让Maple中的数学引擎进入你的桌面应用程序和网站
- Android 适配2
- 【小贴士】虚拟键盘与fixed带给移动端的痛!
- C语言的执行
- 转:不再以讹传讹,GET和POST的真正区别
- webStorm快捷键总结
- HTML 5的革新:结构之美
- 线程池原理及创建并C++实现
- JAVA Web 之 struts2文件上传下载演示(一)(转)
- 配置servers时,错误:Setting property &#39;source&#39; to &#39;org.eclipse.jst.jee.server:hczm&#39; did not find a matching property
- C#在声明对象时对其赋值的一种方式
- java进程卡死问题
- LeetCode_Regular Expression Matching
- 法方总经理用的笔记本电脑&;一体机拆开图。
- 下载centos6.4
- nefu 1029 字符串
- Xshell学习--菜鸟篇
- Python scrapy爬虫学习笔记01
- react-navigation实现页面框架(转载)
- windows平台mysql密码设置