gpt

Time limit: 3s Memory limit: 256MB Input: gpt.in Output: gpt.out

Într-un laborator secret, cercetătorii au construit o versiune experimentală a unui model GPT. Modelul este organizat sub forma unui arbore de module neuronale, fiecare nod al arborelui reprezentând un modul. Considerăm modulul neuronal 11 ca fiind rădăcina arborelui.

Fiecărui modul ii îi este asociat un token, adică o literă mică cic_i din alfabetul englez.

Când un mesaj este transmis între două module uu și vv, acesta urmează unicul drum simplu dintre nodurile respective. Pe parcurs, fiecare modul adaugă propriul token la fluxul de date.

Pentru două noduri uu și vv, notăm cu T(u,v)T(u,v) șirul obținut prin concatenarea token-urilor modulelor întâlnite pe drum, în ordinea parcurgerii.

Se dau QQ query-uri independente. Fiecare query este de forma u vu \ v.

Se consideră un șir fix PP, comun tuturor query-urilor, reprezentând „semnătura GPT perfectă”. Notăm cu LL lungimea șirului PP.

Cerință

Pentru fiecare query, determinați de câte ori apare șirul PP ca subșir în șirul T(u,v)T(u,v).

Un subșir al unui șir se obține prin eliminarea a zero sau mai multe caractere, păstrând ordinea relativă a caracterelor rămase.

Rezultatul fiecărui query se va afișa modulo 109+710^9 + 7.

Date de intrare

Fișierul de intrare gpt.in conține:

  • Pe prima linie, un număr întreg NN.
  • Pe următoarele N1N-1 linii, câte două numere întregi uu și vv, indicând existența unei muchii între nodurile uu și vv.
  • Pe următoarea linie, NN caractere separate prin câte un spațiu: c1,c2,,cNc_1, c_2, \dots, c_N, reprezentând token-urile asociate fiecărui modul.
  • Pe următoarea linie, șirul PP.
  • Pe următoarea linie, un număr întreg QQ — numărul total de query-uri.
  • Pe următoarea linie, două valori întregi aa și bb (folosite pentru generarea query-urilor).
  • Pe ultima linie, două numere întregi u0u_0 și v0v_0, reprezentând primul query.

Query-urile rămase se generează automat folosind formula:

ui=((ui1a+b) xor i)modN+1u_i = ((u_{i-1} \cdot a + b) \text{ xor } i) \bmod N + 1


vi=((uia+b) xor i)modN+1v_i = ((u_i \cdot a + b) \text{ xor } i) \bmod N + 1


unde xor\text{xor} este operatorul ^ din C++ și i=1i=1 pentru primul query generat, i=2i=2 pentru al doilea etc. Se recomandă folosirea unui tip de date de 64 de biți pentru aceste calcule.

Date de ieșire

Fișierul de ieșire gpt.out va conține QQ linii. Pe linia ii se va afișa răspunsul corespunzător celui de-al ii-lea query, modulo 109+710^9 + 7.

Restricții și precizări

  • 1N50 0001 \leq N \leq 50 \ 000
  • 1Q2 000 0001 \leq Q \leq 2 \ 000 \ 000
  • 1u,vN1 \leq u, v \leq N
  • 1L71 \leq L \leq 7
  • 1a,b1 000 0001 \leq a, b \leq 1 \ 000 \ 000
# Puncte Restricții
1 2 N,Q1 000N, Q \leq 1\ 000 și L=1L = 1
2 8 N,Q1 000N, Q \leq 1\ 000 și L3L \leq 3
3 5 N,Q1 000N, Q \leq 1\ 000
4 5 L=1L = 1, N20 000N \leq 20\ 000, Q100 000Q \leq 100\ 000
5 30 L3L \leq 3, N20 000N \leq 20\ 000, Q100 000Q \leq 100\ 000
6 40 N20 000N \leq 20\ 000 și Q100 000Q \leq 100\ 000
7 10 Fără restricții suplimentare

Exemplu

gpt.in

7
1 2
1 3
2 4
2 5
3 6
3 7
a b a a b a b
ab
2
3 12
4 7

gpt.out

4
0

Explicație

Primul query se citește direct: u0=4u_0 = 4, v0=7v_0 = 7.
Valorile pentru generarea query-urilor sunt a=3a = 3, b=12b = 12.
Al doilea query se generează astfel:

u1=((43+12) xor 1)mod7+1=(24 xor 1)mod7+1=25mod7+1=4+1=5u_1 = ((4 \cdot 3 + 12) \text{ xor } 1) \bmod 7 + 1 = (24 \text{ xor } 1) \bmod 7 + 1 = 25 \bmod 7 + 1 = 4 + 1 = 5v1=((53+12) xor 1)mod7+1=(27 xor 1)mod7+1=26mod7+1=5+1=6v_1 = ((5 \cdot 3 + 12) \text{ xor } 1) \bmod 7 + 1 = (27 \text{ xor } 1) \bmod 7 + 1 = 26 \bmod 7 + 1 = 5 + 1 = 6

Astfel, al doilea query devine u=5u = 5, v=6v = 6.

Structura arborelui este:
Muchii: (1,2)(1,2), (1,3)(1,3), (2,4)(2,4), (2,5)(2,5), (3,6)(3,6), (3,7)(3,7)

Token-urile nodurilor:

1a,  2b,  3a,  4a,  5b,  6a,  7b1 \to a,\; 2 \to b,\; 3 \to a,\; 4 \to a,\; 5 \to b,\; 6 \to a,\; 7 \to b

Șirul fix este ab\text{ab}.

  • Pentru query-ul 4 74 \ 7. Drumul este 421374 \to 2 \to 1 \to 3 \to 7, iar șirul obținut este abaab\text{abaab}. Numărul de apariții ale subșirului ab\text{ab} este 44.
  • Pentru query-ul 5 65 \ 6: Drumul este 521365 \to 2 \to 1 \to 3 \to 6, iar șirul obținut este bbaaa\text{bbaaa}. Subșirul ab\text{ab} nu apare în șirul obținut.

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