QOJ.ac

QOJ

Süre Sınırı: 3 s Bellek Sınırı: 384 MB Toplam puan: 100 Zorluk: [göster]

#1788. Komunikacja kwantowa

İstatistikler

Mały Z samodzielnie uczy się o komputerach kwantowych. Ostatnio, studiując rozdział o komunikacji kwantowej, natrafił na ciekawe zadanie. Alice i Bob prowadzą w nim komunikację kwantową. Ich językiem komunikacji jest słownik $S$ rozmiaru $n$, w którym każde słowo $s_i$ ($1\le i\le n$) można przedstawić jako 256-bitowy ciąg zer i jedynek. W tym zadaniu $s_i$ można wygenerować przez wywołanie funkcji gen, dostępnej w pliku gen.cpp w katalogu zadania. Parametry tej funkcji $n,a_1,a_2$ zostaną podane na wejściu.

Alice i Bob przeprowadzą następnie $m$ transmisji. Podczas każdej z nich Alice przesyła Bobowi dokładnie jedno słowo ze słownika. Ich kanał komunikacyjny jest jednak zawodny i podatny na szum. Dokładniej, niech $x_i$ oznacza oryginalne słowo wysłane przez Alice w transmisji $i$. Szum może odwrócić najwyżej $k_i$ bitów tego ciągu. Innymi słowy, jeśli $y_i$ oznacza ciąg odebrany przez Boba, może on różnić się od $x_i$ na najwyżej $k_i$ pozycjach, a ponadto nie musi występować w słowniku $S$.

Tymczasem Bob dowiedział się, że złoczyńca Eve również wniknął do ich kanału komunikacyjnego i zamierza zakłócać komunikację. Robi to, zastępując ciąg odebrany przez Boba dowolnym 256-bitowym ciągiem zer i jedynek, który także może nie występować w słowniku $S$. Eve jest bardzo przebiegły i nie musi ingerować w każdą transmisję.

Teraz Bob poprosił Cię o pomoc. Dla każdej kolejnej transmisji, na podstawie ostatecznie odebranego przez Boba ciągu i progu zakłóceń $k_i$ ($0\le k_i\le 15$), ustal, czy możliwe jest, że Eve nie ingerował w tę transmisję. Oznacza to, że odebrany ciąg można uzyskać ze słowa ze słownika przez odwrócenie najwyżej $k_i$ bitów. Jeśli taka możliwość istnieje, wypisz 1; w przeciwnym razie wypisz 0. Bob bardzo ufa Twoim umiejętnościom, dlatego musisz odpowiadać na bieżąco; szczegółowe wymagania opisano w sekcji wejścia.

Aby skrócić czas wczytywania, ciąg odebrany przez Boba zostanie podany jako łańcuch szesnastkowy długości 64, zawierający cyfry 0–9 oraz wielkie litery A–F. Litery A–F oznaczają kolejno wartości 10–15.

Każdą cyfrę szesnastkową można osobno przekształcić na ciąg bitów, na przykład: 5 odpowiada 0101, A odpowiada 1010, a C odpowiada 1100.

Wejście

Dane należy odczytać z pliku qi.in.

Pierwszy wiersz wejścia zawiera cztery nieujemne liczby całkowite $n,m,a_1,a_2$, oznaczające odpowiednio rozmiar słownika, liczbę transmisji oraz początkowe wartości parametrów a1 i a2 funkcji gen.

W swoim programie należy wywołać wspomnianą w treści zadania funkcję gen, aby wygenerować słownik. Można skopiować i wykorzystać kod z gen.cpp. Tablica wartości logicznych s[N+1][256] w tym programie zawiera wszystkie słowa.

Każdy z kolejnych $m$ wierszy zawiera łańcuch szesnastkowy długości 64 oraz nieujemną liczbę całkowitą $k_i$, oznaczające odpowiednio ciąg ostatecznie odebrany przez Boba w transmisji $i$ i próg zakłóceń.

Aby wymusić udzielanie odpowiedzi na bieżąco, po odtworzeniu 256-bitowego ciągu z łańcucha szesnastkowego należy wykonać XOR każdego bitu z $lastans$, otrzymując rzeczywisty ciąg odebrany przez Boba w tej transmisji. Wartość $lastans\in\{0,1\}$ jest odpowiedzią na poprzednie zapytanie; przed pierwszym zapytaniem wynosi 0.

Uwaga: przy wczytywaniu lub wypisywaniu zmiennych typu unsigned long long za pomocą funkcji scanf i printf odpowiedni specyfikator formatu to llu.

Wyjście

Wynik należy zapisać do pliku qi.out.

Wypisz $m$ wierszy, każdy zawierający liczbę całkowitą 0 lub 1, będącą odpowiedzią na bieżące zapytanie.

Przykładowe zapytania

Aby ułatwić wyjaśnienie zadania, rozważymy uproszczony przykład: słowa ze słownika są podane bezpośrednio, ich długość jest zmniejszona do 4, a na zapytania można odpowiadać offline.

Rozważmy słownik rozmiaru $n=2$, zawierający słowa 1010 i 0111.

Dla zapytania B = 1011 oraz $k_1=1$ odpowiedź wynosi 1: ciąg można uzyskać przez odwrócenie czwartego bitu słowa 1010 (pozycje liczymy od najbardziej do najmniej znaczącego bitu, również poniżej).

Dla zapytania 1 = 0001 oraz $k_2=2$ odpowiedź wynosi 1: wystarczy odwrócić drugi i trzeci bit słowa 0111.

Dla zapytania 1 = 0001 oraz $k_3=1$ odpowiedź wynosi 0.

  • Odwracając najwyżej 1 bit słowa 1010, można uzyskać 1010, 0010, 1110, 1000 i 1011.
  • Odwracając najwyżej 1 bit słowa 0111, można uzyskać 0111, 1111, 0011, 0101 i 0110.
  • Nie można uzyskać 1 = 0001, więc ten ciąg musiał powstać wskutek ingerencji Eve.

Przykład

Przykład 1

Zobacz pliki qi/qi1.in i qi/qi1.ans w katalogu zawodnika.

Przykład 2

Zobacz pliki qi/qi2.in i qi/qi2.ans w katalogu zawodnika.

Przykład 3

Zobacz pliki qi/qi3.in i qi/qi3.ans w katalogu zawodnika.

Ograniczenia

Dla wszystkich testów: $1\le n\le 4\times10^5$, $1\le m\le 1.2\times10^5$, $0\le k\le 15$. Wartości $a_1$ i $a_2$ są losowane jednostajnie z przedziału $[0,2^{64}-1]$.

Numer testu $n=$ $m=$ $k_i\le$ Szczególne właściwości
1 $10$ $10$ $2$ Brak
2 $500$ $500$ $15$ Brak
3 $1000$ $1000$ $0$ Brak
4 $2000$ $2000$ $2$ Brak
5 $5000$ $5000$ $15$ Brak
6 $10000$ $10000$ $15$ Brak
7 $20000$ $20000$ $15$ Brak
8 $100000$ $100000$ $1$ Brak
9 $400000$ $120000$ $1$ Brak
10 $50000$ $50000$ $2$ Brak
11 $70000$ $70000$ $3$ Brak
12 $100000$ $100000$ $2$ Brak
13 $30000$ $30000$ $5$ Brak
14 $60000$ $60000$ $4$ Brak
15 $120000$ $120000$ $5$ Brak
16 $60000$ $60000$ $8$ Wszystkie ciągi w zapytaniach są generowane losowo
17 $120000$ $120000$ $12$ Wszystkie ciągi w zapytaniach są generowane losowo
18 $400000$ $100000$ $15$ Wszystkie ciągi w zapytaniach są generowane losowo
19 $30000$ $30000$ $7$ Brak
20 $60000$ $60000$ $9$ Brak
21 $90000$ $90000$ $11$ Brak
22 $200000$ $120000$ $12$ Brak
23 $400000$ $80000$ $15$ Brak
24 $400000$ $100000$ $15$ Brak
25 $400000$ $120000$ $15$ Brak

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.