Quantum Computing este o tehnologie nouă ce folosește proprietățile mecanicii cuantice pentru a efectua anumite calcule într-un timp mult mai scurt decât este capabil să le facă un calculator clasic. Diferența fundamentală dintre un calculator clasic și unul cuantic este modul în care procesează informația. Un calculator clasic procesează informația folosind biți, care pot fi sau . Pe de altă parte, un calculator cuantic utilizează qubiți, care pot avea în același timp și valoarea (notată cu ) și valoarea (notată cu ) - spunem că qubitul se află în starea cuantică . Efectuând modificări asupra acestor qubiți, putem dezvolta algoritmi cuantici cu o complexitate mai bună decât a celor mai buni algoritmi clasici existenți. Totuși, calculatoarele cuantice nu au încă utilitate practică deoarece nu dispun de un număr suficient de mare de qubiți (la ora actuală cele mai puternice calculatoare cuantice au câteva sute de qubiți). Pentru simplitate, vom lucra doar cu stări pure ( sau ).
Să considerăm un calculator cuantic cu qubiți setați inițial la . Asupra acestor qubiți se poate efectua un singur tip de operații: se inversează toți qubiții ( devine și vice versa) dintr-o subsecvență (qubiți aflați pe poziții consecutive). Exemplu: devine dacă se inversează qubiții de pe pozițiile , și . O particularitate nefericită a unui calculator cuantic este că fiecare operație introduce erori (de exemplu, este posibil ca un qubit să nu se inverseze, deși ar trebui să o facă). De aceea, este necesar ca un algoritm cuantic să efectueze un număr cât mai mic de operații.
Cerință
Aflați numărul minim de operații necesare pentru a seta toți qubiții la în situațiile:
- Operațiile se pot efectua asupra subsecvențelor de orice lungime;
- Operațiile se pot efectua doar asupra subsecvențelor de lungime .
Date de intrare
Datele de intrare conţin pe prima linie două numere întregi și , separate printr-un spațiu, unde reprezintă tipul cerinței și numărul de teste. Pe următoarele linii se află descrierea testelor.
Dacă atunci pe prima linie a fiecărui test se află numărul întreg , reprezentând numărul de qubiți, iar pe a doua linie se află caractere reprezentând starea inițială a qubiților ( este reprezentat prin și este reprezentat prin ).
Dacă atunci pe prima linie a fiecărui test se află două numere întregi și , separate printr-un spațiu, reprezentând numărul de qubiți și lungimea unei subsecvențe pe care se poate efectua o operație, iar pe a doua line starea inițială a qubiților, descrisă la fel ca pentru .
Date de ieșire
Se vor afișa linii, pe fiecare linie aflându-se numărul minim de operații necesare pentru a seta toți qubiții la . Pentru se garantează că există mereu o soluție. Pentru , dacă nu există soluție, se va afișa .
Restricții și precizări
- ;
- ;
- suma valorilor lui pe toate testele nu va depăși ;
- Subtask (p): ;
- Subtask (p): și ;
- Subtask (p): .
Exemplul 1
stdin
1 2
4
0101
7
0010110
stdout
2
3
Explicație
Pentru primul test, putem obține un număr minim de operații în următorul mod: .
Pentru al doilea test, putem obține un număr minim de operații în următorul mod: .
Exemplul 2
stdin
2 2
12 4
110100100000
5 2
01100
stdout
4
-1
Explicație
Pentru primul test, putem obține un număr minim de operații în următorul mod: .
Pentru al doilea test, se poate demonstra că nu există soluție.