Submission #3919562


Source Code Expand

#include <bits/stdc++.h>
#define ll long long
#define INF 1000000005
#define MOD 1000000007
#define EPS 1e-10
#define rep(i,n) for(int i=0;i<(int)(n);++i)
#define rrep(i,n) for(int i=(int)(n)-1;i>=0;--i)
#define srep(i,s,t) for(int i=(int)(s);i<(int)(t);++i)
#define each(a,b) for(auto& (a): (b))
#define all(v) (v).begin(),(v).end()
#define len(v) (int)(v).size()
#define zip(v) sort(all(v)),v.erase(unique(all(v)),v.end())
#define cmx(x,y) x=max(x,y)
#define cmn(x,y) x=min(x,y)
#define fi first
#define se second
#define pb push_back
#define show(x) cout<<#x<<" = "<<(x)<<endl
#define spair(p) cout<<#p<<": "<<p.fi<<" "<<p.se<<endl
#define sar(a,n) cout<<#a<<":";rep(pachico,n)cout<<" "<<a[pachico];cout<<endl
#define svec(v) cout<<#v<<":";rep(pachico,v.size())cout<<" "<<v[pachico];cout<<endl
#define svecp(v) cout<<#v<<":";each(pachico,v)cout<<" {"<<pachico.first<<":"<<pachico.second<<"}";cout<<endl
#define sset(s) cout<<#s<<":";each(pachico,s)cout<<" "<<pachico;cout<<endl
#define smap(m) cout<<#m<<":";each(pachico,m)cout<<" {"<<pachico.first<<":"<<pachico.second<<"}";cout<<endl

using namespace std;

typedef pair<int,int> P;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<double> vd;
typedef vector<P> vp;
typedef vector<string> vs;

const int MAX_N = 2005;

// 根がi, 連成j個, 根があと何個つながれるか(0/1/2), ペアの偶奇
int dp[MAX_N][2][MAX_N][3][2];
int sb[MAX_N];

vector<int> G[MAX_N];

int add(int x,int y)
{
    return (x + y)%MOD;
}

int sub(int x,int y)
{
    return (x+MOD-y)%MOD;
}

int mul(int x,int y)
{
    return (ll)x*y%MOD;
}

int inv[MAX_N],fac[MAX_N],finv[MAX_N];

void make()
{
	fac[0] = fac[1] = 1;
	finv[0] = finv[1] = 1;
	inv[1] = 1;
	for(int i=2;i<MAX_N;i++){
		inv[i] = MOD - (ll)inv[MOD%i] * (MOD/i) % MOD;
		fac[i] = (ll)fac[i-1] * i % MOD;
		finv[i] = (ll)finv[i-1] * inv[i] % MOD;
	}
}

int comb(int a,int b)
{
	if(a<b){
		return 0;
	}
	return fac[a] * ((ll)finv[b] * finv[a-b] % MOD) % MOD;
}

int dfs(int u, int p){
    sb[u]++;
    dp[u][0][1][2][0] = 1;
    int mx = 1;
    each(v, G[u]){
        if(v != p){
            sb[u] += dfs(v, u);
            srep(i,1,mx+1){
                // k = 0 のとき
                // くっつかない
                for(int j = sb[v]; j >= 1; j--){
                    rep(l,2){
                        rep(m,2){
                            dp[u][1][i+j][0][l^m] = add(dp[u][1][i+j][0][l^m], mul(dp[u][0][i][0][l], mul(add(dp[v][0][j][0][m], dp[v][0][j][1][m]) + dp[v][0][j][2][m], comb(i+j, i))));
                        }
                    }
                }
                // k = 1
                // くっつく
                for(int j = sb[v]; j >= 1; j--){
                    rep(l,2){
                        rep(m,2){
                            dp[u][1][i+j-1][0][l^m^1] = add(dp[u][1][i+j-1][0][l^m^1], mul(dp[u][0][i][1][l], mul(dp[v][0][j][2][m], comb(i+j-1, i))));
                            dp[u][1][i+j-1][0][l^m^1] = add(dp[u][1][i+j-1][0][l^m^1], mul(dp[u][0][i][1][l], mul(mul(dp[v][0][j][1][m], inv[2]), comb(i+j-1, i))));
                        }
                    }
                }
                // くっつかない
                for(int j = sb[v]; j >= 1; j--){
                    rep(l,2){
                        rep(m,2){
                            dp[u][1][i+j][1][l^m] = add(dp[u][1][i+j][1][l^m], mul(dp[u][0][i][1][l], mul(dp[v][0][j][0][m], comb(i+j, i))));
                            dp[u][1][i+j][1][l^m] = add(dp[u][1][i+j][1][l^m], mul(dp[u][0][i][1][l], mul(mul(mul(dp[v][0][j][1][m], inv[2]), i), comb(i+j, i+1))));
                            dp[u][1][i+j][1][l^m] = add(dp[u][1][i+j][1][l^m], mul(dp[u][0][i][1][l], mul(mul(dp[v][0][j][1][m], inv[2]), comb(i+j, i))));
                            dp[u][1][i+j][1][l^m] = add(dp[u][1][i+j][1][l^m], mul(dp[u][0][i][1][l], mul(mul(dp[v][0][j][2][m], i), comb(i+j, i+1))));
                        }
                    }
                }
                // k = 2
                // くっつく
                for(int j = sb[v]; j >= 1; j--){
                    rep(l,2){
                        rep(m,2){
                            dp[u][1][i+j-1][1][l^m^1] = add(dp[u][1][i+j-1][1][l^m^1], mul(dp[u][0][i][2][l], mul(2 * dp[v][0][j][2][m], comb(i+j-1, i))));
                            dp[u][1][i+j-1][1][l^m^1] = add(dp[u][1][i+j-1][1][l^m^1], mul(dp[u][0][i][2][l], mul(dp[v][0][j][1][m], comb(i+j-1, i))));
                        }
                    }
                }
                // くっつかない
                for(int j = sb[v]; j >= 1; j--){
                    rep(l,2){
                        rep(m,2){
                            dp[u][1][i+j][2][l^m] = add(dp[u][1][i+j][2][l^m], mul(dp[u][0][i][2][l], mul(dp[v][0][j][0][m], comb(i+j, i))));
                            dp[u][1][i+j][2][l^m] = add(dp[u][1][i+j][2][l^m], mul(dp[u][0][i][2][l], mul(mul(dp[v][0][j][1][m], i), comb(i+j, i+1))));
                            dp[u][1][i+j][2][l^m] = add(dp[u][1][i+j][2][l^m], mul(dp[u][0][i][2][l], mul(mul(dp[v][0][j][2][m], i-1), comb(i+j, i+1))));
                        }
                    }
                }
            }
            swap(dp[u][0], dp[u][1]);
            rep(j,mx+1){
                rep(k,2){
                    rep(l,2){
                        dp[u][1][j][k][l] = 0;
                    }
                }
            }
            mx += sb[v];
        }
    }
    // rep(j,mx){
    //     rep(k,3){
    //         rep(l,2){
    //             cout << u << " " << j << " " << k << " " << l << " " << dp[u][0][j][k][l] << "\n";
    //         }
    //     }
    // }
    return sb[u];
}

int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
    int n;
    cin >> n;
    rep(i,n-1){
        int a;
        cin >> a;
        G[a-1].pb(i+1);
    }
    make();
    dfs(0, -1);
    int ans = 0;
    rep(i,n){
        rep(j,3){
            ans = add(ans, dp[0][0][i+1][j][0]);
            ans = sub(ans, dp[0][0][i+1][j][1]);
        }
    }
    cout << ans << "\n";
    return 0;
}

Submission Info

Submission Time
Task A - Awkward
User kopricky
Language C++14 (GCC 5.4.1)
Score 0
Code Size 6337 Byte
Status WA
Exec Time 1547 ms
Memory 189184 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 1000
Status
AC × 1
WA × 3
AC × 1
WA × 54
Set Name Test Cases
Sample a01, a02, a03, a04
All a01, a02, a03, a04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33, b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49, b50, b51, b52, b53, b54, b55
Case Name Status Exec Time Memory
a01 WA 2 ms 640 KB
a02 AC 2 ms 512 KB
a03 WA 2 ms 512 KB
a04 WA 2 ms 896 KB
b05 WA 2 ms 384 KB
b06 WA 1544 ms 186880 KB
b07 WA 1530 ms 189184 KB
b08 WA 1524 ms 188672 KB
b09 WA 1522 ms 188672 KB
b10 WA 1521 ms 188672 KB
b11 WA 1524 ms 188672 KB
b12 WA 1524 ms 188672 KB
b13 WA 1529 ms 187648 KB
b14 WA 1544 ms 187008 KB
b15 WA 1525 ms 188672 KB
b16 WA 397 ms 94464 KB
b17 WA 8 ms 9216 KB
b18 WA 2 ms 512 KB
b19 WA 1527 ms 188544 KB
b20 WA 1523 ms 188672 KB
b21 WA 1523 ms 188672 KB
b22 WA 1524 ms 188544 KB
b23 WA 1528 ms 188416 KB
b24 WA 1524 ms 188672 KB
b25 WA 1527 ms 188672 KB
b26 WA 1544 ms 186880 KB
b27 WA 1533 ms 188800 KB
b28 WA 1547 ms 188544 KB
b29 WA 1530 ms 188928 KB
b30 WA 1530 ms 188928 KB
b31 WA 1528 ms 188800 KB
b32 WA 1531 ms 189056 KB
b33 WA 1525 ms 188672 KB
b34 WA 1527 ms 188800 KB
b35 WA 1528 ms 188800 KB
b36 WA 1525 ms 188672 KB
b37 WA 1528 ms 188672 KB
b38 WA 1529 ms 188672 KB
b39 WA 1526 ms 188672 KB
b40 WA 1529 ms 188672 KB
b41 WA 1526 ms 188672 KB
b42 WA 1527 ms 188672 KB
b43 WA 1530 ms 188544 KB
b44 WA 1526 ms 188672 KB
b45 WA 1531 ms 188800 KB
b46 WA 1530 ms 189184 KB
b47 WA 1530 ms 189184 KB
b48 WA 1530 ms 189184 KB
b49 WA 1533 ms 189184 KB
b50 WA 1544 ms 187136 KB
b51 WA 1545 ms 187264 KB
b52 WA 1544 ms 186880 KB
b53 WA 1544 ms 187008 KB
b54 WA 1544 ms 186880 KB
b55 WA 1530 ms 188032 KB