感觉很多树上难以直接求解的问题都可以转化为动态规划问题并进行求解$.$
令 $f[x],g[x]$ 分别表示以 $x$ 为根的子树不想上延申,向上延申的方案数$.$
这里向上延申指的是会有其他子树的节点与该点子树中某个点颜色相同并进行配对$.$
考虑转移:
$f[x]=g[x]=\prod_{v\in son[x]} (f[v]+g[v]).$
然而,我们还要减掉一些不合法的.
令 $v'$ 表示我们当前枚举到的儿子.
先考虑 $f[x]:$
首先,$x$ 儿子中不可能只有一个延申:$f[x]$ 已经表示在 $x$ 终止了,而只有一个延申的话不能在 $x$ 终止.
所以,$f[x]=\prod_{v\in son[x]} (f[v]+g[v])-\frac{\prod_{v\in son[x]}f[v]}{f[v']}\times g[v'].$
而 $g[x]$ 中不能出现一个都不延申的情况,即 $g[x]=\prod_{v\in son[x]} (f[v]+g[v])-\prod_{v\in son[x]}f[v].$

#include <cstdio>
#include <algorithm>
#define N 200005
#define mod 998244353
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
ll qpow(ll base,ll k)
{
ll tmp=1;
for(;k;base=base*base%mod,k>>=1) if(k&1) tmp=tmp*base%mod;
return tmp;
}
ll inv(ll k)
{
return qpow(k,mod-2);
}
int n,edges;
ll f[N],g[N];
int hd[N],to[N],nex[N],size[N];
void add(int u,int v)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
void dfs(int u)
{
int i;
size[u]=1;
ll sum=1;
f[u]=g[u]=1;
for(i=hd[u];i;i=nex[i])
{
int v=to[i];
dfs(v);
size[u]+=size[v];
sum=sum*f[v]%mod;
f[u]=f[u]*((f[v]+g[v])%mod)%mod;
}
g[u]=f[u];
if(size[u]>1)
{
g[u]=(g[u]+mod-sum)%mod;
for(i=hd[u];i;i=nex[i])
{
int v=to[i];
ll tmp=inv(f[v])*g[v]%mod;
tmp=tmp*sum%mod;
f[u]=(f[u]+mod-tmp)%mod;
}
}
}
int main()
{
int i,j;
// setIO("input");
scanf("%d",&n);
for(i=2;i<=n;++i)
{
int a;
scanf("%d",&a),add(a,i);
}
dfs(1);
printf("%lld\n",f[1]);
return 0;
}

  

最新文章

  1. GJM : 【C# 高性能服务器】完成端口、心跳的高性能Socket服务器 [转载]
  2. 关于 Oracle 的数据导入导出及 Sql Loader (sqlldr) 的用法
  3. 【技术贴】VirtualBox给VDI格式的虚拟机扩容
  4. php 图片添加文字水印 以及 图片合成(微信快码传播)
  5. UESTC 881 神秘绑架案 --二维DP
  6. 使用spool导出数据
  7. 只 一行显示可左右滚动的文本(UITextField中文限制)
  8. Windows 系统消息范围和前缀,以及消息大全
  9. Centos7系统配置上的变化(二)网络管理基础
  10. Centos7安装Docker 基于Dockerfile 搭建httpd运行环境
  11. Processes and Threads
  12. leetcode--010 Linked List Cycle II
  13. BZOJ2219 数论之神 数论 中国剩余定理 原根 BSGS
  14. 最简单的操作 jetty IDEA 【debug】热加载
  15. auto_increment 自增键的一些说明
  16. SpringMVC探究-----常用获取传递参数的方法
  17. [UE4]UniformGirdPanel
  18. scikit-learn的GBDT工具进行特征选取。
  19. AVPlayerLayer
  20. c++日志练习

热门文章

  1. # [洛谷1337] 吊打XXX/平衡点 (模拟退火)
  2. 虚拟机(Vmware)安装ubuntu18.04和配置调整(二)
  3. HORSE PILL--一种新型的linux rootkit
  4. 【问题】【编程环境】fatal error: security/pam_appl.h
  5. ipairs与pairs的区别
  6. mqtt协议实现 java服务端推送功能(一)安装
  7. php--常见算法2
  8. 使用Gallery制作图片浏览器
  9. onItemSelected 获取选中的 信息 3种方法
  10. 2.java多线程_synchronized(Lock)同步