HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5
思路来自 某FXXL
不过复杂度咋算的..
/*
HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Contest 5
题意:给出N个点的树,求去边的方案数使得 去边后最大匹配数是M的倍数限制: N<=5e4, M<=200
分析:设 DP[u][i][0] 表示 以点 u 为根的子树 最大匹配数模 m 为 i 时,且 u 点没有匹配的方案数DP[u][i][1] 表示 以点 u 为根的子树 最大匹配数模 m 为 i 时,且 u 点匹配上的方案数得到对于 u 的某个子节点 v 对 u 的更新(讨论(u,v)的边连与不连)DP[u][k][0] += ∑ [i+j==k] 2 * DP[u][i][0] * DP[v][j][1] + 1 * DP[u][i][0] * DP[v][j][0]DP[u][k][1] += ∑ [i+j==k] 2 * DP[u][i][1] * ( DP[v][j][0] + DP[v][j][1] )DP[u][k][1] += ∑ [i+j==k-1] DP[u][i][0] * DP[v][j][0]每次在合并的时候更新u节点的取值范围,即 size[u] = min(size[u]+size[v], m) 这样复杂度大概 O(nm)(???)
*/
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const LL MOD = 998244353;
const int N = 5e4+5;
const int M = 205;
vector<int> G[N];
int t, n, m;
int size[N];
LL dp[N][M][2];
LL tmp[M<<1][2];
void solve(int u, int v)
{memset(tmp, 0, sizeof(tmp));for (int i = 0; i <= size[u]; i++)for (int j = 0; j <= size[v]; j++){tmp[i+j][1] += 2 * dp[u][i][1] * (dp[v][j][0]+dp[v][j][1]);tmp[i+j][1] %= MOD;tmp[i+j+1][1] += dp[u][i][0] * dp[v][j][0];tmp[i+j+1][1] %= MOD;tmp[i+j][0] += 2 * dp[u][i][0]*dp[v][j][1] + dp[u][i][0]*dp[v][j][0];tmp[i+j][0] %= MOD;}for (int i = 0; i < m; i++){dp[u][i][0] = (tmp[i][0] + tmp[i+m][0]) % MOD;dp[u][i][1] = (tmp[i][1] + tmp[i+m][1]) % MOD;}size[u] = min(m, size[u]+size[v]);
}
void dfs(int u, int pre)
{memset(dp[u], 0, sizeof(dp[u]));dp[u][0][0] = 1;size[u] = 1;for (auto & v : G[u]){if (v == pre) continue;dfs(v, u);solve(u, v);}
}
int main()
{scanf("%d", &t);while (t--){scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) G[i].clear();for (int i = 1; i < n; i++){int u, v; scanf("%d%d", &u, &v);G[u].push_back(v);G[v].push_back(u);}dfs(1, 1);int ans = (dp[1][0][0]+dp[1][0][1]) % MOD;printf("%d\n", ans);}
}
转载于:https://www.cnblogs.com/nicetomeetu/p/7360556.html
HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5相关推荐
- HDU 4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)
题意:给定n*m个格子,每个格子能填0-k 的整数.然后给出每列之和和每行之和,问有没有解,有的话是不是唯一解,是唯一解输出方案. 思路:网络流,一共 n+m+2个点 源点 到行连流量为 所给的 ...
- HDU 6051 - If the starlight never fade | 2017 Multi-University Training Contest 2
/* HDU 6051 - If the starlight never fade [ 原根,欧拉函数 ] | 2017 Multi-University Training Contest 2 题意: ...
- HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3
/* HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3 题意:给出排列 a[N],求所有区间的第 ...
- hdu 6086 Rikka with String(AC自动机+状压dp)
题目链接:hdu 6086 Rikka with String 题意: 给你n个只含01的串,和一个长度L,现在让你构造出满足s[i]≠s[|s|−i+1] for all i∈[1,|s|] ,长度 ...
- HDU 6085 Rikka with Candies (暴力压位)
题目链接 HDU 6085 Rikka with Candies 分析 其实很容易想到一个有技巧的暴力方法,我们可以这样办 首先对于每一个 AiA_i 我们考虑比 AiA_i 大的部分 BB ,对于这 ...
- 2017 Multi-University Training Contest - Team 3 Kanade's sum hd6058
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6058 题目: Kanade's sum Time Limit: 4000/2000 MS (J ...
- 2019 Multi-University Training Contest 9 1007 Rikka with Travels
HDU 6686 Rikka with Travels 题意: 在一颗树上选择两条不相交的路径的可能性有多少,路径长度定义为路径的顶点数. 题解: 初步思考,观察样例可以发现,求的是两条路径的有序对, ...
- Sichuan University Programming Contest 2018 Preliminary
嗯为了防止大家AK,所以这次的A题和K题我们就当做不存在好了! 经历了昨天写了两个多小时的博客没保存的心态炸裂,今天终于下了个Markdown.所以我猜这篇的格式应该会更好看一点! 好吧废话不多说 题 ...
- hdu 4925 Apple Tree--2014 Multi-University Training Contest 6
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4925 Apple Tree Time Limit: 2000/1000 MS (Java/Others ...
最新文章
- 网页学名为html文件,什么是HTML
- Java中classpath配置
- Java出现No enclosing instance of type Test is accessible. Must qualify the allocation with an enclosin
- 内存管理器剖析:ptmalloc,windows,macOS
- Rails运行时sqlite3报错问题的解决
- css的几种垂直水平居中方法
- unity天空盒渐变_Unity 制作天空盒
- java求出遍历二叉树的路径,102. 二叉树的层序遍历
- python 指定时间运行代码
- 清华计算机学院教师名单,清华大学计算机科学与技术系导师教师师资介绍简介-艾海舟...
- java实现学生、老师信息管理系统
- 在线计算机微积分,高等数学计算器
- Cortex-M0芯片GPIO详解
- 手把手教你十分钟学会使用小程序云存储
- mini计算机结构,简单拆机看内部构造_苹果 Mac mini MGEN2CH/A_台式电脑评测-中关村在线...
- mysql 订单表 订单详情表 关联 排序 统计
- C/C++牛客网刷题练习之翻转链表篇
- terminate called after throwing an instance of ‘YAML::TypedBadConversion<int>‘ what(): bad conver
- 【C语言】C语言之数字金字塔全家桶
- BSN与区块链云服务的区别是什么?