998244353">思路
998244353">树形dp,设计状态如下:
998244353">
递推公式如下:
参考自
代码
#include
#include
#include
#include
using namespace std;
#define int long long
#define mod 998244353
#define N 50001
#define M 410
vector vec[N];
int dp[N][M][2],size[N]/*记录节点能最多能匹配多少边*/,temp[M][2]/*dp数组在更新中途不能更改,故用此数组代替*/,m;
void add(int u,int v)//使用边更新数组
{
memset(temp,0,sizeof(temp));
for(int i=0;i<=size[u];i++)//这里时间复杂度可以证明为n*m
{
for(int j=0;j<=size[v];j++)
{
temp[i+j][0]+=2*dp[u][i][0]*dp[v][j][1]+dp[u][i][0]*dp[v][j][0];
temp[i+j][0]%=mod;
temp[i+j][1]+=2*dp[u][i][1]*(dp[v][j][0]+dp[v][j][1]);
temp[i+j][1]%=mod;
temp[i+j+1][1]+=dp[u][i][0]*dp[v][j][0];
temp[i+j+1][1]%=mod;
}
}
for(int i=0;i>n>>m;
for(int i=1;i