Submission #2099747
Source Code Expand
#include <iostream>
#include <vector>
#include <cstdio>
#include <algorithm>
#include <set>
#include <map>
#include <cassert>
#include <numeric>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
#ifdef LOCAL
#define eprintf(...) fprintf(stderr, __VA_ARGS__)
#else
#define eprintf(...) 42
#endif
typedef long long int int64;
const int MOD = (int) 1e9 + 7;
void sadd(int &a, int b)
{
a += b;
if (a >= MOD) a -= MOD;
}
void ssub(int &a, int b)
{
a -= b;
if (a < 0) a += MOD;
}
int add(int a, int b)
{
sadd(a, b);
return a;
}
int sub(int a, int b)
{
ssub(a, b);
return a;
}
int mul(int a, int b)
{
return (a * 1LL * b) % MOD;
}
int fpow(int x, int n)
{
if (n == 0) return 1;
int a = fpow(x, n >> 1);
a = mul(a, a);
if (n & 1) a = mul(a, x);
return a;
}
int rev(int x)
{
return fpow(x, MOD - 2);
}
int rev2;
int divi2(int a)
{
return mul(a, rev2);
}
const int N = 2005;
vector <int> ch[N];
int _C[N][N];
int fact[N];
int C(int n, int k)
{
if (k < 0 || k > n) return 0;
return _C[n][k];
}
struct Ans
{
vector <int> dp, dpEnd, dpOnly;
Ans() : dp({0, 0}), dpEnd({0, 0}), dpOnly({0, 1}) {}
Ans operator + (const Ans &A) const // root from this
{
Ans ans;
ans.dpOnly[1] = 0;
ans.dp.resize((int) dp.size() + (int) A.dp.size() - 1, 0);
ans.dpEnd.resize((int) dpEnd.size() + (int) A.dpEnd.size() - 1, 0);
ans.dpOnly.resize((int) dpOnly.size() + (int) A.dpOnly.size() - 1, 0);
for (int i = 1; i < (int) dp.size(); i++)
for (int j = 1; j < (int) A.dp.size(); j++)
{
int ox = dp[i], oEnd = dpEnd[i], oOnly = dpOnly[i], ax = A.dp[j], aEnd = A.dpEnd[j], aOnly = A.dpOnly[j];
int aAll = add(ax, add(aEnd, aOnly) );
sadd(ans.dp[i + j], mul(ox, aAll) );
sadd(ans.dpEnd[i + j], mul(oEnd, aAll) );
sadd(ans.dpOnly[i + j], mul(oOnly, aAll) );
sadd(ans.dp[i + j - 1], mul(oEnd, divi2(aEnd) ) );
sadd(ans.dpEnd[i + j - 1], mul(oOnly, mul(2, aOnly) ) );
sadd(ans.dpEnd[i + j - 1], mul(oOnly, aEnd) );
sadd(ans.dp[i + j - 1], mul(oEnd, aOnly) );
}
return ans;
}
int pvi()
{
int ans = 0;
for (int i = 1; i < (int) dp.size(); i++)
{
int cur = add(dp[i], add(dpEnd[i], dpOnly[i] ) );
cur = mul(cur, fact[i] );
if ( ( (int) dp.size() - i) % 2)
sadd(ans, cur);
else ssub(ans, cur);
}
return ans;
}
void eprint(int id)
{
eprintf("---\nv = %d\n", id);
for (int i = 1; i < (int) dp.size(); i++)
{
eprintf("%d : dp %d, dpEnd %d, dpOnly %d\n", i, dp[i], dpEnd[i], dpOnly[i] );
}
}
};
Ans dfs(int v)
{
Ans cur = Ans();
for (int to : ch[v] )
{
eprintf("%d -> %d\n", v, to);
// cur.eprint(10 + v);
cur = cur + dfs(to);
}
// cur.eprint(v);
return cur;
}
int main(int, char **)
{
#ifdef LOCAL
freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
for (int i = 0; i < N; i++)
{
_C[i][i] = _C[i][0] = 1;
for (int j = 1; j < i; j++)
_C[i][j] = add(_C[i - 1][j], _C[i - 1][j - 1] );
}
fact[0] = 1;
for (int i = 1; i < N; i++)
fact[i] = mul(fact[i - 1], i);
rev2 = rev(2);
int n;
scanf("%d", &n);
for (int i = 1; i < n; i++)
{
int x;
scanf("%d", &x);
x--;
ch[x].push_back(i);
}
Ans ans = dfs(0);
int answer = ans.pvi();
printf("%d\n", answer);
return 0;
}
Submission Info
Submission Time |
|
Task |
A - Awkward |
User |
Merkurev |
Language |
C++14 (GCC 5.4.1) |
Score |
1000 |
Code Size |
3970 Byte |
Status |
AC |
Exec Time |
106 ms |
Memory |
16128 KB |
Compile Error
./Main.cpp: In function ‘int main(int, char**)’:
./Main.cpp:166:20: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &n);
^
./Main.cpp:170:24: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &x);
^
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
1000 / 1000 |
Status |
|
|
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 |
AC |
7 ms |
15104 KB |
a02 |
AC |
7 ms |
15104 KB |
a03 |
AC |
7 ms |
15104 KB |
a04 |
AC |
7 ms |
15104 KB |
b05 |
AC |
7 ms |
15104 KB |
b06 |
AC |
53 ms |
15232 KB |
b07 |
AC |
63 ms |
16128 KB |
b08 |
AC |
73 ms |
15232 KB |
b09 |
AC |
63 ms |
15232 KB |
b10 |
AC |
58 ms |
15232 KB |
b11 |
AC |
50 ms |
15232 KB |
b12 |
AC |
48 ms |
15232 KB |
b13 |
AC |
49 ms |
15232 KB |
b14 |
AC |
53 ms |
15232 KB |
b15 |
AC |
73 ms |
15232 KB |
b16 |
AC |
19 ms |
15232 KB |
b17 |
AC |
7 ms |
15104 KB |
b18 |
AC |
7 ms |
15104 KB |
b19 |
AC |
74 ms |
15232 KB |
b20 |
AC |
63 ms |
15232 KB |
b21 |
AC |
59 ms |
15232 KB |
b22 |
AC |
71 ms |
15232 KB |
b23 |
AC |
66 ms |
15232 KB |
b24 |
AC |
58 ms |
15232 KB |
b25 |
AC |
54 ms |
15232 KB |
b26 |
AC |
56 ms |
15232 KB |
b27 |
AC |
55 ms |
15360 KB |
b28 |
AC |
55 ms |
15232 KB |
b29 |
AC |
63 ms |
15616 KB |
b30 |
AC |
63 ms |
15616 KB |
b31 |
AC |
65 ms |
15488 KB |
b32 |
AC |
63 ms |
16000 KB |
b33 |
AC |
83 ms |
15232 KB |
b34 |
AC |
106 ms |
15232 KB |
b35 |
AC |
103 ms |
15360 KB |
b36 |
AC |
79 ms |
15232 KB |
b37 |
AC |
77 ms |
15232 KB |
b38 |
AC |
83 ms |
15232 KB |
b39 |
AC |
86 ms |
15232 KB |
b40 |
AC |
82 ms |
15232 KB |
b41 |
AC |
78 ms |
15232 KB |
b42 |
AC |
79 ms |
15232 KB |
b43 |
AC |
78 ms |
15232 KB |
b44 |
AC |
76 ms |
15232 KB |
b45 |
AC |
62 ms |
16000 KB |
b46 |
AC |
63 ms |
16128 KB |
b47 |
AC |
63 ms |
16128 KB |
b48 |
AC |
63 ms |
16128 KB |
b49 |
AC |
63 ms |
16128 KB |
b50 |
AC |
56 ms |
15232 KB |
b51 |
AC |
54 ms |
15232 KB |
b52 |
AC |
55 ms |
15232 KB |
b53 |
AC |
53 ms |
15232 KB |
b54 |
AC |
53 ms |
15232 KB |
b55 |
AC |
60 ms |
15616 KB |