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);
}
}
HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5的更多相关文章
- HDU 6091 - Rikka with Match
思路 树形dp,设计状态如下: 设 $dp_u_i_0$表示 以点 u 为根的子树 最大匹配数模 m 为 i 时,且 u 点没有匹配的方案数 DP[u][i][1] 表示 以点 u 为根的子树 最大匹 ...
- HDU 6088 - Rikka with Rock-paper-scissors | 2017 Multi-University Training Contest 5
思路和任意模数FFT模板都来自 这里 看了一晚上那篇<再探快速傅里叶变换>还是懵得不行,可能水平还没到- - 只能先存个模板了,这题单模数NTT跑了5.9s,没敢写三模数NTT,可能姿势太 ...
- HDU 6093 - Rikka with Number | 2017 Multi-University Training Contest 5
JAVA+大数搞了一遍- - 不是很麻烦- - /* HDU 6093 - Rikka with Number [ 进制转换,康托展开,大数 ] | 2017 Multi-University Tra ...
- HDU 6085 - Rikka with Candies | 2017 Multi-University Training Contest 5
看了标程的压位,才知道压位也能很容易写- - /* HDU 6085 - Rikka with Candies [ 压位 ] | 2017 Multi-University Training Cont ...
- HDU 6162 - Ch’s gift | 2017 ZJUT Multi-University Training 9
/* HDU 6162 - Ch’s gift [ LCA,线段树 ] | 2017 ZJUT Multi-University Training 9 题意: N节点的树,Q组询问 每次询问s,t两节 ...
- HDU 6090 Rikka with Graph —— 2017 Multi-University Training 5
Rikka with Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- hdu 6088 Rikka with Rock-paper-scissors (2017 多校第五场 1004) 【组合数学 + 数论 + 模意义下的FFT】
题目链接 首先利用组合数学知识,枚举两人的总胜场数容易得到 这还不是卷积的形式,直接搞的话复杂度大概是O(n^2)的,肯定会TLE.但似乎和卷积有点像?想半天没想出来..多谢Q巨提醒,才知道可以用下面 ...
- 2017 Wuhan University Programming Contest (Online Round) Lost in WHU 矩阵快速幂 一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开。
/** 题目:Lost in WHU 链接:https://oj.ejq.me/problem/26 题意:一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开. ...
- 2017 Wuhan University Programming Contest (Online Round) C. Divide by Six 分析+模拟
/** 题目:C. Divide by Six 链接:https://oj.ejq.me/problem/24 题意:给定一个数,这个数位数达到1e5,可能存在前导0.问为了使这个数是6的倍数,且没有 ...
随机推荐
- c++项目经验分享
1.C++的const比C语言#define更好的原因? 首先,它能够明确指定类型,有类型检查功能. 其次,可以使用C++的作用域规则将定义限制在特定的函数[常函数]或文件中. 第三,可以将const ...
- js中Boolean类型和Number类型的一些常见方法
Boolean类型 Boolean类型重写了valueOf() 方法, 返回基本布尔类型值true或false,重写了toString() 方法,返回基本字符串"true" 和 & ...
- 74HC573锁存器应用(附英文手册)
锁存器(LATCH)概念 锁存器(Latch)是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态. 锁存,就是把信号暂存以维持某种电平状态. 锁存器作用: 缓存 完成高速的控 ...
- python3 简陋的学生信息管理系统
# 编写一个“学生信息管理系统”# 输入序号:1. 输入学生信息,学生信息包括:id,name,age,gender(用什么数据类型保存?)# 2. 查询:输入学生姓名和id,显示学生个人信息# 3. ...
- pyspider 数据存入Mysql--Python3
一.不写入Mysql 以爬取哪儿网为例. 以下为脚本: from pyspider.libs.base_handler import * class Handler(BaseHandler): cra ...
- oralce学习笔记(二)
分区清理: --范围分区示例 drop table range_part_tab purge; --注意,此分区为范围分区 create table range_part_tab (id number ...
- linux安装好的mysql rpm -qa |grep mysql不见
输入: rpm -qa|grep -i mysql
- JAVA调用系统命令:python、shell等
实际项目开发场景中,可能会用到java项目调用系统命令的需求,如调用python或者shell脚本 可以参考如下例子,例子来源于ambari源码: \ambari\ambari-server\src\ ...
- C# vb .net实现圆角矩形特效滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的圆角矩形效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...
- sqlserver 2005 数据库的差异备份与还原
找到一个可靠的步骤,点开链接:http://blog.csdn.net/kevindr/article/details/22154323