思路来自 某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);
}
}

  

最新文章

  1. 独立开发 一个社交 APP 的架构分享 (已实现)
  2. js foreach比for多出两个undefined
  3. redis批量删除
  4. BigInteger大数家法源代码及分析
  5. java nio2
  6. iOS多线程之GCD小记
  7. 最全面的Android Intent机制讲解
  8. sql-----点点滴滴
  9. ④bootstrap列表使用基础案例
  10. 删除a表中和b表相同的数据
  11. 【SQL】 MySql与SqlServer差异比较(MySql踩坑全集)
  12. 2018-08-29 浏览器插件实现GitHub代码翻译原型演示
  13. linux 测试 get 请求 跳过SSL证书验证
  14. Nuget 配置文件的位置
  15. Arrays常用方法
  16. 关于 WebBrowser调用百度地图API 鼠标滚轮缩放地图级别失灵的解决办法
  17. Pocket Cube
  18. 浅析I/O模型
  19. Linux 设备模型之 (kobject、kset 和 Subsystem)(二)
  20. Scratch3.0设计的插件系统(上篇)

热门文章

  1. ubuntu查看软件安装位置
  2. Go语言【学习】defer和逃逸分析
  3. KepServerEX读写三菱PLC,车间现场测试记录,带你了解【数据采集的困境】的前世与今生
  4. for循环与if条件语句的复习运用
  5. PHP 使用 pdo 操作oracle数据库 报错
  6. golang 之 sql
  7. [cf 1194 D] 1-2-K Game
  8. ELK学习笔记之使用curl命令操作elasticsearch
  9. C#泛型集合之——哈希集合
  10. 实战Go内存泄露【转】