思路来自 某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相关推荐

  1. HDU 4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)

    题意:给定n*m个格子,每个格子能填0-k 的整数.然后给出每列之和和每行之和,问有没有解,有的话是不是唯一解,是唯一解输出方案. 思路:网络流,一共 n+m+2个点   源点 到行连流量为 所给的 ...

  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 题意: ...

  3. HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3

    /* HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3 题意:给出排列 a[N],求所有区间的第 ...

  4. 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|] ,长度 ...

  5. HDU 6085 Rikka with Candies (暴力压位)

    题目链接 HDU 6085 Rikka with Candies 分析 其实很容易想到一个有技巧的暴力方法,我们可以这样办 首先对于每一个 AiA_i 我们考虑比 AiA_i 大的部分 BB ,对于这 ...

  6. 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 ...

  7. 2019 Multi-University Training Contest 9 1007 Rikka with Travels

    HDU 6686 Rikka with Travels 题意: 在一颗树上选择两条不相交的路径的可能性有多少,路径长度定义为路径的顶点数. 题解: 初步思考,观察样例可以发现,求的是两条路径的有序对, ...

  8. Sichuan University Programming Contest 2018 Preliminary

    嗯为了防止大家AK,所以这次的A题和K题我们就当做不存在好了! 经历了昨天写了两个多小时的博客没保存的心态炸裂,今天终于下了个Markdown.所以我猜这篇的格式应该会更好看一点! 好吧废话不多说 题 ...

  9. 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 ...

最新文章

  1. 网页学名为html文件,什么是HTML
  2. Java中classpath配置
  3. Java出现No enclosing instance of type Test is accessible. Must qualify the allocation with an enclosin
  4. 内存管理器剖析:ptmalloc,windows,macOS
  5. Rails运行时sqlite3报错问题的解决
  6. css的几种垂直水平居中方法
  7. unity天空盒渐变_Unity 制作天空盒
  8. java求出遍历二叉树的路径,102. 二叉树的层序遍历
  9. python 指定时间运行代码
  10. 清华计算机学院教师名单,清华大学计算机科学与技术系导师教师师资介绍简介-艾海舟...
  11. java实现学生、老师信息管理系统
  12. 在线计算机微积分,高等数学计算器
  13. Cortex-M0芯片GPIO详解
  14. 手把手教你十分钟学会使用小程序云存储
  15. mini计算机结构,简单拆机看内部构造_苹果 Mac mini MGEN2CH/A_台式电脑评测-中关村在线...
  16. mysql 订单表 订单详情表 关联 排序 统计
  17. C/C++牛客网刷题练习之翻转链表篇
  18. terminate called after throwing an instance of ‘YAML::TypedBadConversion<int>‘ what(): bad conver
  19. 【C语言】C语言之数字金字塔全家桶
  20. BSN与区块链云服务的区别是什么?

热门文章

  1. Edit Distance
  2. C语言文件操作函数大全
  3. libuvc介绍及简单使用
  4. CV_IMAGE_ELEM参数赋值时注意的问题
  5. OpenCV的cvLoadImage函数
  6. 【FFmpeg】ffmpeg中函数返回的错误码:AVERROR及AVERROR_*
  7. findler mac 隐藏文件_Fiddler使用文档
  8. easypoi教程_EasyPoi教程
  9. php改7z,PHP的7z扩展名? - php
  10. ios 代码设置控件宽高比_用宽高比调整UIImage的大小?