Gepetto

Time limit: 2.5s Memory limit: 512MB Input: Output:

Familia bunicului Gepetto este foarte numeroasă, fiind formată din el însuși și din N1N-1 descendenți ai acestuia (copii, nepoți, stră-nepoți, stră-stră-stră-nepoți, etc.).

Deoarece Gepetto nu poate reține numele tuturor membrilor familiei sale, el a atribuit fiecăruia dintre aceștia (inclusiv lui însuși) câte un număr unic între 11 și NN.

În plus, deoarece Gepetto nu se înțelege bine cu rudele sale prin alianță, el ține minte pentru fiecare persoană doar cine este părintele său care este la rândul său un descendent al lui Gepetto. Pentru fiecare 1in1 \le i \le n, fie PiP_i numărul asociat părintelui persoanei ii. Considerăm că numărul asociat părintelui lui Gepetto este 00.

De ziua copilului, Gepetto vrea să le ofere tuturor membrilor familiei sale (inclusiv lui însuși) câte un cadou, însă este frământat de ordinea în care să ofere cadourile. O ordine de oferire a cadourilor poate fi reprezentată ca o permutare A1,A2,,AnA_1, A_2, \ldots, A_n, cu semnificația că:

  • Gepetto va oferi primul cadou persoanei cu numărul A1A_1;
  • Gepetto va oferi al doilea cadou persoanei cu numărul A2A_2;
  • \ldots
  • Gepetto va oferi ultimul cadou persoanei cu numărul AnA_n.

Gepetto consideră că o ordine de oferire a cadourilor este bună dacă fiecare persoană din familie își va primi cadoul mai devreme decât toți copiii săi.

După ce a ales o ordine bună de oferire a cadourilor V1,V2,VnV_1, V_2, \ldots V_n, Gepetto se întreabă totuși pe ce poziție s-ar afla această ordine în șirul sortat lexicografic1^1 al tuturor ordinilor bune de oferire a cadourilor.

Deoarece această poziție poate fi foarte mare, Gepetto este mulțumit și cu restul acesteia modulo 109+710^9+7.

1^1 O ordine A1,A2,,ANA_1,A_2,\ldots,A_N este mai mică lexicografic decât o altă ordine B1,B2,,BNB_1,B_2,\ldots,B_N dacă există o poziție ii (1iN1 \le i \le N) pentru care:

  • Aj=BjA_j=B_j, pentru toți indicii jj care satisfac 1j<i1 \le j<i;
  • Ai<BiA_i < B_i.

Detalii de implementare

Va trebui să implementezi funcția

int solve(int N, std::vector<int> P, std::vector<int> V)

care primește ca parametri:

  • NN, numărul de membri ai familiei.
  • PP, vector indexat de la 00 unde PiP_i reprezintă părintele persoanei i+1i + 1 pentru oricare 0i<N0 \leq i < N.
  • VV, o permutare a numerelor {1,2,N}\{1, 2, \ldots N\}, reprezentând ordinea de dăruire a cadourilor aleasă de Gepetto.

Funcția va returna un singur număr întreg, reprezentând indicele permutării în șirul sortat lexicografic modulo 1 000 000 0071 \ 000 \ 000 \ 007.

Restricții și precizări

  • 1N1 000 0001 \leq N\leq 1 \ 000 \ 000
  • 0PiN0 \leq P_i \leq N
  • 1ViN1 \leq V_i \leq N
  • Se garantează că există exact un ii pentru care Pi=0P_i=0. Acest ii este numărul asociat lui Gepetto.
  • Se garantează că graful format din toate muchiile (i,Pi)(i, P_i) este un arbore (un graf neorientat aciclic).
  • Se garantează că fiecare număr de la 11 la NN apare o singură dată în șirul VV. În alte cuvinte, se garantează că șirul VV este o permutare de ordin NN.
# Punctaj Restricții
1 7 1N101 \leq N \leq 10
2 16 1N2001 \leq N \leq 200
3 22 1N5 0001 \leq N \leq 5 \ 000
4 11 Există un nod cu N1N-1 copii
5 27 1N200 0001 \leq N \leq 200 \ 000
6 17 Fără restricții suplimentare.

Exemplul 1

input

6
3 3 0 3 3 3
3 4 6 1 2 5

output

67

Explicație

Arborele genealogic din primul exemplu:

Exemplul 2

input

10
4 9 9 0 1 4 9 4 4 8
4 6 1 8 5 10 9 3 7 2

output

5158

Explicație

Arborele genealogic din al doilea exemplu:

Log in or sign up to be able to send submissions!