Skip to content

Commit 63a6b0f

Browse files
committed
.\ski_resort_planning.cpp
1 parent 2e558b7 commit 63a6b0f

2 files changed

Lines changed: 110 additions & 0 deletions

File tree

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#ifdef _MSC_VER
2+
#define _CRT_SECURE_NO_WARNINGS
3+
#endif
4+
5+
#include <algorithm>
6+
#include <iostream>
7+
#include <sstream>
8+
#include <string>
9+
#include <vector>
10+
#include <queue>
11+
#include <set>
12+
#include <map>
13+
#include <cstdio>
14+
#include <cstdlib>
15+
#include <cctype>
16+
#include <cmath>
17+
#include <string>
18+
#include <cstring>
19+
#include <ctime>
20+
using namespace std;
21+
22+
#define REP(i,n) for(int i=0;i<(n);++i)
23+
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
24+
#define RFOR(i,a,b) for(int i=(a);i>=(b);--i)
25+
typedef long long LL;
26+
27+
#define MAXN 5000
28+
#define MOD 1000000007
29+
30+
LL two[MAXN + 5];
31+
int p[MAXN + 5];
32+
int sz[MAXN + 5];
33+
34+
void run() {
35+
int n, v;
36+
scanf("%d", &n);
37+
p[0] = -1;
38+
sz[0] = 1;
39+
LL ret = 1;
40+
FOR(i,1,n-1) {
41+
scanf("%d", &v);
42+
LL tmp = (two[sz[v]] + MOD - 1) % MOD;
43+
REP(j,i) {
44+
if (p[j] == v) {
45+
tmp = (tmp - (two[sz[j]] - 1) % MOD + MOD) % MOD;
46+
}
47+
}
48+
ret = (ret * tmp) % MOD;
49+
p[i] = v;
50+
sz[i] = 1;
51+
while (v != -1) {
52+
++sz[v];
53+
v = p[v];
54+
}
55+
}
56+
printf("%d\n", ret);
57+
}
58+
59+
int main() {
60+
two[0] = 1;
61+
FOR(i,1,MAXN) two[i] = (two[i - 1] << 1) % MOD;
62+
int kase;
63+
scanf("%d", &kase);
64+
FOR(k,1,kase) {
65+
printf("Case #%d: ", k);
66+
run();
67+
}
68+
return 0;
69+
}

0 commit comments

Comments
 (0)