Fişierul intrare/ieşire:fft.in, fft.outSursăConcursul National de Informatica "Adolescent Grigore Moisil" 18
AutorVlad-Andrei MunteanuAdăugată deAGMinformaticaAGMInformatica AGMinformatica
Timp execuţie pe test7 secLimită de memorie262144 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Fast Fourier Transformation

Dupa cum bine stiti, polinoamele sunt o parte cruciala a matematicii fara de care dezvoltarea, atat pe plan tehnologic, cat si pe plan social (daca nu am vorbi despre polinoame, atunci despre ce am mai vorbi?!), nu ar fi fost posibile. Dar mai intai, ce este cu adevarat un polinom? Un matematician adevarat o sa va spuna ca un polinom este o expresie care are in componenta sa o variabila, de regula notata cu x, un set de constante, numite coeficienti, si care admite drept operatii numai adunarea, scaderea, inmultirea si ridicarea la putere constanta, numar natural. Mai mult, v-ar putea spune ca, in general, un polinom definit pe o multime M are urmatoarea forma: P(x) = a0 + a1 * x + a2 * x2 + ... + an * xn, unde n este un numar natural, iar a0, a1, a2, ..., an sunt constante si fac parte din M. Asta este complet neadevarat! Un polinom este, de fapt, o unealta diabolica cu ajutorul careia comisia poate tortura concurentii fara sa se chinuie prea tare. Daca va intrebati cum, este foarte simplu. Se iau doua polinoame (daca se poate sa aiba coeficientii luati de pe O.E.I.S., este cu atat mai bine) si se cere sa se inmulteasca intre ele in complexitate O(n * log2n). Credeti ca asta nu este posibil? Ati fi surprinsi! Din fericire pentru voi, noi consideram ca ar fi prea demodat sa cerem aplicarea algoritmului Fast Fourier Transformation (a se vedea Strada Cramei). Asa ca, ne-am gandit sa mai aprofundam putin utilitatea acestori minuni revolutionare si am aflat ca le poti folosi pentru a transforma un sir de caractere, intr-un numar natural, numit cheie. Tot ce trebuie sa faci este sa iti alegi un numar natural b, un numar natural nenul m, sa iti consideri drept ai codul ASCII al caracterului aflat pe pozitia i in sirul de caractere (indexat de la 0) si sa calculezi P(b) MOD m. Pentru a nu va chinui prea tare, comisia va ofera atat sirul de caractere, cat si numerele b si m, dar va cere in schimb sa raspundeti la q intrebari de forma: Cate subsecvente de tip palindrom au lungimea cuprinsa intre l1 si l2 si cheia cuprinsa intre m1 si m2?

Date de intrare

Fişierul de intrare fft.in contine pe prima linie numerele b si m, avand semnificatia din enunt. A doua linie contine un sir de caractere, de lungime n. A treia linie contine numarul q, reprezentand numarul de intrebari la care comisia va cere sa raspundeti. Fiecare dintre urmatoarele q linii contine un set de numere m1 m2 l1 l2, reprezentand o intrebare.

Date de ieşire

În fişierul de ieşire fft.out se vor afisa raspunsurile pentru fiecare intrebare, pe linii separate, in ordinea in care acestea au fost citite.

Restricţii

  • 1 ≤ n ≤ 200.000
  • 1 ≤ q ≤ 200.000
  • 0 ≤ b ≤ 1018
  • 1 ≤ m ≤ 1018
  • 0 ≤ m1 ≤ 1018
  • 0 ≤ m2 ≤ 1018
  • 0 ≤ l1 ≤ n
  • 0 ≤ l2 ≤ n

Exemplu

fft.infft.out
3 1000000
aaba
2
17 199 1 1
99 5000 1 3
4
2

Explicaţie

Pentru prima intrebare subsecventele sunt: [0, 0], [1, 1], [2, 2], [3, 3].
Pentru a doua intrebare subsecventele sunt: [0, 1], [1, 3].

Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?