一个树形DP,
f[i]=表示以i为根可以得到的子树个数;
则f[i]*=(f[j]+1);
初始化f[i]=1;
ans=sigma(f[i]);
#include <bits/stdc++.h> #define p 1000000007 using namespace std; struct littlestar{ int to; int nxt; }star[200010]; int head[200010],cnt; void add(int u,int v) { star[++cnt].to=v; star[cnt].nxt=head[u]; head[u]=cnt; } long long f[100010]; void dfs(int u,int fa) { for(int i=head[u];i;i=star[i].nxt){ int v=star[i].to; if(v==fa) continue; dfs(v,u); f[u]=(f[u]*(f[v]+1))%p; } } signed main() { int n; cin>>n; for(int i=1;i<=n;i++) f[i]=1; for(int i=1;i<=n-1;i++){ int u,v; scanf("%d%d",&u,&v); add(u,v); add(v,u); } dfs(1,0); long long ans=0; for(int i=1;i<=n;i++){ ans=(ans+f[i])%p; } cout<<ans%p; return 0; }