题目链接:https://codeforces.com/contest/1146/problem/F
dp[now][0]表示没有儿子和当前节点相连的方案数
dp[now][1]表示只有一个儿子和当前节点相连的方案数
dp[now][2]表示多个儿子和当前节点相连的方案数
然后转移就很好写了
代码:
#include<bits/stdc++.h>
#define xx first
#define yy second
#define mp make_pair
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int MAXN=2e5+5;
const int MOD=998244353;
int dp[MAXN][3];
vector<int> E[MAXN];
void dfs(int now)
{
if(E[now].size()==0)
{
dp[now][2]=1;
return ;
}
int sz=E[now].size();
dp[now][0]=1;
for(int v:E[now])
{
dfs(v);
dp[now][2]=(1LL*dp[now][2]*(1LL*dp[v][0]+dp[v][2]+dp[v][2]+dp[v][1])%MOD+1LL*dp[now][1]*(dp[v][1]+dp[v][2])%MOD)%MOD;
dp[now][1]=(1LL*dp[now][1]*(dp[v][0]+dp[v][2])%MOD+1LL*dp[now][0]*(dp[v][2]+dp[v][1])%MOD)%MOD;
dp[now][0]=1LL*dp[now][0]*(dp[v][0]+dp[v][2])%MOD;
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;
scanf("%d",&n);
for(int i=2;i<=n;i++)
{
int x;
scanf("%d",&x);
E[x].pb(i);
}
dfs(1);
ll ans=(dp[1][0]+dp[1][2])%MOD;
printf("%lld\n",ans);
return 0;
}