树形 d p dp dp
用 f i f_i fi 表示在编号为 i i i 的子树中共有多少种方案。
显然, f u = ∏ v ⊆ s o n u f v + 1 f_u=\prod\limits_{v\subseteq son_u}{f_v}+1 fu=v⊆sonu∏fv+1
后面的那个 1 1 1 就是考虑自身不要的情况。最后答案要减掉这个 1 1 1
代码
#include<cstdio>
using namespace std;
int n,x;
struct edges{
int to,nex;
}edge[1001];
int head[1001],kk;
void add(int u,int v){
edge[++kk]=(edges){v,head[u]};head[u]=v;
}
int f[1001];
void dfs(int u){
f[u]=1;
for(int i=head[u];i;i=edge[i].nex){
int v=edge[i].to;
dfs(v);
f[u]*=f[v];
}
f[u]++;
}
int main(){
scanf("%d",&n);
for(int i=1;i<n;i++)scanf("%d",&x),add(x,i);
dfs(n);
printf("%d",f[n]-1);
return 0;
}