#include<iostream>#include<vector>#include<cstdio>#include<cstring>using namespace std;const int maxn = 1e5+5;const int mod = 1e4+7;vector<int> m[maxn];int dp[maxn][2], n;void dfs(int r){ dp[r][0] = dp[r][1] = 1; for(int i = 0; i < m[r].size(); i++) { int child = m[r][i]; dfs(child); dp[r][0] = dp[r][0]*(dp[child][0]+dp[child][1])%mod; dp[r][1] = dp[r][1]*dp[child][0]%mod; }}int main(void){ while(cin >> n) { memset(dp, 0, sizeof(dp)); for(int i = 0; i < maxn; i++) m[i].clear(); for(int i = 2; i <= n; i++) { int t; scanf("%d", &t); m[t].push_back(i); } dfs(1); PRintf("%d/n", (dp[1][0]+dp[1][1]-1+mod)%mod); } return 0;}方法二(递推):#include<iostream>#include<cstdio>#include<cstring>#include<vector>using namespace std;const int maxn = 1e5+5;const int mod = 1e4+7;int dp[maxn][2];vector<int> m[maxn];int main(void){ int n; while(cin >> n) { memset(dp, 0, sizeof(dp)); for(int i = 0; i < maxn; i++) m[i].clear(); for(int i = 2; i <= n; i++) { int t; scanf("%d", &t); m[t].push_back(i); } for(int i = n; i > 0; i--) { dp[i][0] = dp[i][1] = 1; for(int j = 0; j < m[i].size(); j++) { dp[i][1] = (dp[i][1]*dp[m[i][j]][0])%mod; dp[i][0] = dp[i][0]*(dp[m[i][j]][0]+dp[m[i][j]][1])%mod; } } printf("%d/n", (dp[1][0]+dp[1][1]-1+mod)%mod); } return 0;}
新闻热点
疑难解答