1 - Brojorb
Vremensko ograničenje | Memorijsko ograničenje |
---|---|
1000ms | 1024MB |
Brojorb je pozitivan ceo broj koji u svom binarnom zapisu ima tačno onoliko različitih potpalindroma koliko i cifara.
Potpalindrom je niz uzastopnih cifara u binarnom zapisu koje se čitaju isto i od napred i od nazad.
Npr. \(155 = (10011011)\)2 je brojorb zato što ima tačno 8 različitih potpalindroma: ([1]0011011), ([1001]1011), (1[0]011011), (1[00]11011), (10[0110]11), (100[11]011), (100[11011]), (1001[101]1). Dok recimo \(203 = (11001011)\)2 nije brojorb zbog toga što ima 7 različitih potpalindroma.
Potrebno je da odgovorite na pitanje koliko ima brojorba koji su manji od \(N\)?
Napomena
Ovo je zadatak sa poznatim ulazom (output-only zadatak). Vama su dati ulazni fajlovi (2.in
, 3.in
, ... 16.in
) kao i opis u tabeli ispod, dok vi treba da pošaljete samo odgovarajuće izlazne fajlove za njih (2.out
, 3.out
, ... 16.out
).
Vaš izvorni kod kojim ste generisali izlazne fajlove i izračunali rešenja potrebno je da pošaljete kao rešenje prvog primera (gde piše ”učitaj izlaz broj 01")
Opis ulaza
U prvom i jedinom redu ulaznih fajlova nalazi se nalazi broj \(N\).
Opis izlaza
U prvom i jedinom redu ispišite koliko ima brojorba koji su manji od \(N\).
Primer 1
Ulaz
Izlaz
Objašnjenje primera
Jedini brojevi manji od 212 koji nisu brojorbi su 203 i 211.
Bodovanje
U tabeli ispod su dati ulazni brojevi za koje treba izračunati rešenje i broj poena koji donose.
Primer | Broj poena | Primer | Broj poena | ||||||
---|---|---|---|---|---|---|---|---|---|
01 | Pošaljite vaš kod | 0 | 09 | N = 35802962412 | 6 | ||||
02 | N = 1748063 | 5 | 10 | N = 146900865525 | 7 | ||||
03 | N = 13497742 | 5 | 11 | N = 287835581101 | 7 | ||||
04 | N = 39374969 | 5 | 12 | N = 681224605882 | 7 | ||||
05 | N = 375466538 | 6 | 13 | N = 1119584485997 | 8 | ||||
06 | N = 1809756849 | 6 | 14 | N = 2199024540265 | 8 | ||||
07 | N = 7676048889 | 6 | 15 | N = 4398047597508 | 9 | ||||
08 | N = 24323337576 | 6 | 16 | N = 8796093532561 | 9 |
Autor | Tekst i test primeri | Analiza rеšenja | Testiranje |
---|---|---|---|
Dušan Zdravković | Dušan Zdravković | Ivan Stošić | Ivan Stošić |
Za početak, dokažimo da je broj različitih potpalindroma nekog stringa manji ili jednak dužini stringa. Dokaz indukcijom po dužini stringa. Za stringove dužine \(1\) tvrđenje očigledno važi. Neka je \(S\) string dužine \(n = |S| > 1\) i neka je \(S' = S_1S_2\ldots S_{n-1}\). Posmatrajmo sve sufikse od \(S\) koji su palindromi. Svi osim najdužeg sufiksa se sigurno javljaju i u \(S'\) jer su oni ujedno pravi prefiksi najdužeg sufiks palindroma. Odavde sledi da \(S\) ima najviše \(1\) potpalindrom više od \(S'\) što dokazuje tvrđenje. Stringove koji zadovoljavaju jednakost ove teoreme zvaćemo punim.
Korisno je primetiti da, ukoliko je \(S\) pun string, tada je i svaki njegov prefiks takođe pun string, što nam omogućava da ovakve stringove generišemo rekurzivno, tako što na trenutni pun string dodajemo karakter \(0\) ili \(1\), sve dok vrednost ovog broja ne dostigne gornju granicu, kada izlazimo iz rekurzije. Ovu rekurziju možemo ubrzati na sledeći način:
- Umesto sa stringovima, raditi sa bit maskama. Sve potrebne operacije sa stringovima mogu se implementirati kao bitovske operacije na brojevima.
- Tokom rekurzije čuvati skup potpalindroma za trenutni broj. Unutar jednog koraka rekurzije ovaj skup će se promeniti za tačno jedan element.
- Proveravamo samo najduži sufiks palindrom novogenerisanog broja. Iz dokaza teoreme znamo da je dovoljno posmatrati samo njega.
- Pored samog broja, čuvati i obrnut zapis tog broja u rekurziji kako bi se izbeglo njegovo obrtanje pri traženju najdužeg sufiks palindroma.
Sa ovim opservacijama, složenost rekurzivne funkcije može se spustiti na \(O(m)\) po pozivu, gde je \(m\) najveća dužina binarnog zapisa brojeva. Ukupna složenost celog algoritma je onda \(O(mk)\), gde je \(k\) broj pronađenih punih stringova. Kako je \(k < 10^{10}\) čak i za poslednji, najveći primer, vreme izvršenja celog programa je nekoliko desetina minuta.
01_brojorb.cpp | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
|