CF1146F Leaf Partition 树形DP

Code: 

#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; 
} 

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值