Quantum Computing

Time limit: 0.5s Memory limit: 64MB Input: Output:

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 00 sau 11. Pe de altă parte, un calculator cuantic utilizează qubiți, care pot avea în același timp și valoarea 00 (notată cu 0| 0 \rangle) și valoarea 11 (notată cu 1| 1 \rangle) - spunem că qubitul se află în starea cuantică ψ=α0+β1| \psi \rangle = \alpha | 0 \rangle + \beta |1 \rangle. 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 (0| 0 \rangle sau 1| 1 \rangle).

Să considerăm un calculator cuantic cu NN qubiți setați inițial la q1q2..qN| q_1 \rangle | q_2 \rangle .. | q_N \rangle. Asupra acestor qubiți se poate efectua un singur tip de operații: se inversează toți qubiții (0| 0 \rangle devine 1| 1 \rangle și vice versa) dintr-o subsecvență (qubiți aflați pe poziții consecutive). Exemplu: 0010| 0 \rangle | 0 \rangle | 1 \rangle | 0 \rangle devine 0101| 0 \rangle | 1 \rangle | 0 \rangle | 1 \rangle dacă se inversează qubiții de pe pozițiile 22, 33 și 44. 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 1| 1 \rangle în situațiile:

  1. Operațiile se pot efectua asupra subsecvențelor de orice lungime;
  2. Operațiile se pot efectua doar asupra subsecvențelor de lungime KK.

Date de intrare

Datele de intrare conţin pe prima linie două numere întregi CC și TT, separate printr-un spațiu, unde CC reprezintă tipul cerinței și TT numărul de teste. Pe următoarele linii se află descrierea testelor.

Dacă C=1C=1 atunci pe prima linie a fiecărui test se află numărul întreg NN, reprezentând numărul de qubiți, iar pe a doua linie se află NN caractere reprezentând starea inițială a qubiților (0| 0 \rangle este reprezentat prin "0""0" și 1| 1 \rangle este reprezentat prin "1""1").

Dacă C=2C=2 atunci pe prima linie a fiecărui test se află două numere întregi NN și KK, 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 C=1C=1.

Date de ieșire

Se vor afișa TT linii, pe fiecare linie aflându-se numărul minim de operații necesare pentru a seta toți qubiții la 1| 1 \rangle. Pentru C=1C=1 se garantează că există mereu o soluție. Pentru C=2C=2, dacă nu există soluție, se va afișa 1-1.

Restricții și precizări

  • 1T101 \leq T \leq 10;
  • 1KN1061 \leq K \leq N \leq 10^6;
  • suma valorilor lui NN pe toate testele nu va depăși 10610^6;
  • Subtask 11 (4040p): C=1C = 1;
  • Subtask 22 (2020p): C=2C = 2 și N1 000N \leq 1 \ 000;
  • Subtask 33 (4040p): C=2C = 2.

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: 010110011111| 0 \rangle | 1 \rangle | 0 \rangle | 1 \rangle \rightarrow | 1 \rangle | 0 \rangle | 0 \rangle | 1 \rangle \rightarrow | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle .

Pentru al doilea test, putem obține un număr minim de operații în următorul mod: 0010110001000111000011111111| 0 \rangle | 0 \rangle | 1 \rangle | 0 \rangle | 1 \rangle | 1 \rangle | 0 \rangle \rightarrow | 0 \rangle | 0 \rangle | 1 \rangle | 0 \rangle | 0 \rangle | 0 \rangle | 1 \rangle \rightarrow | 1 \rangle | 1 \rangle | 0 \rangle | 0 \rangle | 0 \rangle | 0 \rangle | 1 \rangle \rightarrow | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle.

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: 110100100000110100101111110011001111111100001111111111111111| 1 \rangle | 1 \rangle | 0 \rangle | 1 \rangle | 0 \rangle | 0 \rangle | 1 \rangle | 0 \rangle | 0 \rangle | 0 \rangle | 0 \rangle | 0 \rangle \rightarrow | 1 \rangle | 1 \rangle | 0 \rangle | 1 \rangle | 0 \rangle | 0 \rangle | 1 \rangle | 0 \rangle | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle \rightarrow | 1 \rangle | 1 \rangle | 0 \rangle | 0 \rangle | 1 \rangle | 1 \rangle | 0 \rangle | 0 \rangle | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle \rightarrow | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle | 0 \rangle | 0 \rangle | 0 \rangle | 0 \rangle | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle \rightarrow | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle | 1 \rangle.

Pentru al doilea test, se poate demonstra că nu există soluție.

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