MATEMATICKÁ OLYMPIÁDA NA STREDNÝCH ŠKOLÁCH 54. ročník, školský rok 2004/2005 Zadania úloh 3. kola kategórie P 1. súťažný deň Na riešenie úloh máte 4.5

Podobné dokumenty
Paralelné algoritmy, cast c. 2

Tue Oct 3 22:05:51 CEST Začiatky s jazykom C 2.1 Štruktúra programu Štruktúra programu by sa dala jednoducho popísať nasledovnými časťami, kto

Metódy násobenie v stredoveku

Úroveň strojového kódu procesor Intel Pentium Pamäťový operand Adresovanie pamäte Priama nepriama a indexovaná adresa Práca s jednorozmerným poľom Pra

Úvod do lineárnej algebry Monika Molnárová Prednášky 2006

Microsoft Word - 6 Výrazy a vzorce.doc

Vzorové riešenia úlohy 4.1 Bodovanie Úvod do TI 2010 Dôvod prečo veľa z Vás malo málo bodov bolo to, že ste sa nepokúsili svoje tvrdenia dokázať, prič

Hardwarové prerušenie Nasledujúci kód ukazuje inštaláciu obsluhy časovača vrátane jeho inicializácie // inicializace časovače, přerušení každou milise

(ıkolské kolo-PYT)

Microsoft Word - zapis-predmetov-AiS

Microsoft Word - Zaver.pisomka_januar2010.doc

Informačné technológie

8 Cvičenie 1.1 Dokážte, že pre ľubovoľné body X, Y, Z platí X + Y Z = Z + Y X. 1.2 Dokážte, že pre ľubovoľné body A, B, D, E, F, G afinného priestoru

SK MATEMATICKA OLYMPIADA 2010/ ročník MO Riešenia úloh domáceho kola kategórie Z4 1. Doplň do prázdnych políčok čísla od 1 do 7 každé raz tak,

NÁVRH UČEBNÝCH OSNOV PRE 1

1 Rekurencie este raz riesenia niektorych rekurencii z cvik. mame danu rekurenciu napr T (n) = at ( n b ) + k. idea postupu je postupne rozpisovat cle

Microsoft Word - 06b976f06a0Matice - Uzivatelska Dokumentacia

Matematický model činnosti sekvenčného obvodu 7 MATEMATICKÝ MODEL ČINNOSTI SEKVENČNÉHO OBVODU Konečný automat predstavuje matematický model sekvenčnéh

Microsoft PowerPoint - Prog_p08.ppt

Zeszyty Naukowe PWSZ, Nowy Sącz 2013 Konštrukcie magických obdĺžnikov Marián Trenkler Faculty of Education, Catholic University in Ružomberok Hrabovsk

Prenosový kanál a jeho kapacita

Katalóg cieľových požiadaviek k maturitnej skúške

Paralelné algoritmy, cast c. 3

Zobrazenie čísiel v počítači Celé nezáporné čísla - čísla bez znamienka dvojková sústava iné používané sústavy - šestnástková a osmičková BCD kódovani

Novinky programu MSklad

Vnútorná reprezentácia údajových typov

Súkromné gymnázium, Česká 10, Bratislava INFORMATIKA

Metrické konštrukcie elipsy Soňa Kudličková, Alžbeta Mackovová Elipsu, ako regulárnu kužeľosečku, môžeme študovať synteticky (konštrukcie bodov elipsy

Microsoft Word - mnohouholnik.doc

STRUČNÝ NÁVOD KU IP-COACHU

Microsoft Word - skripta3b.doc

Tabuľky_teoria

Navigácia po úvodnej stránke elektronickej schránky Dátum zverejnenia: Verzia: 10 Dátum aktualizácie: Navigácia po úvodnej st

FAQ

Metódy dokazovanie v matematike 1 Základné pojmy Matematika exaktná veda vybudovaná DEDUKTÍVNE ZÁKLADNÉ POJMY základy každej matematickej teórie sú in

Pokrocilé programovanie XI - Diagonalizácia matíc

Microsoft Word - Algoritmy a informatika-priesvitky02.doc

03_ControlFlow.dvi

2.5. Dotyčnica krivky, dotykový kužeľ. Nech f je krivka a nech P V (f) (t.j. m P (f) 1). Ak m P (f) = r a l je taká priamka, že I P (f, l) > r, potom

PowerPoint Presentation

STRUČNÝ NÁVOD KU IP-COACHU

ECDL Syllabus V50 SK-V01

SK MATEMATICKÁOLYMPIÁDA skmo.sk 2009/ ročník MO Riešenia úloh česko-poľsko-slovenského stretnutia 1. Určte všetky trojice (a, b, c) kladných r

gazdikova

Paralelné algoritmy, cast c. 3

Republika Srbsko MINISTERSTVO OSVETY, VEDY A TECHNOLOGICKÉHO ROZVOJA ÚSTAV PRE HODNOTENIE KVALITY VZDELÁVANIA A VÝCHOVY VOJVODINSKÝ PEDAGOGICKÝ ÚSTAV

Olympiáda v informatike ročník (2018/2019) zadania krajského kola kategória A Priebeh krajského kola Krajské kolo 34. ročníka Olympi

Ako vystaviť faktúru za službu pre občana (nezdaniteľnú osobu) s bydliskom v ČR, keď miestom dodania služby je ČR (tzv. Mini One Stop Shop)?

Olympiáda v informatike ročník (2012/2013) zadania domáceho kola kategórie A a B Informácie a pravidlá Pre koho je súťaž určená? Kat

2

Photo Album

0022-vub-mobilne-tokeny-200x200-v03.indd

Microsoft Word - Transparencies03.doc

História

Microsoft Word _1_.docx

Centrum vedecko-technických informácií, Odbor pre hodnotenie vedy, Oddelenie pre hodnotenie publikačnej činnosti Vyhľadávanie a práca so záznamami - C

Algoritmizácia a programovanie - Príkazy

(Microsoft Word - Tuzemsk\341 a zahrani\350n\341 jazda \232tandardn\341 jazda.docx)

Cvičenie 9 Riešené príklady 1. Príklad min f(x 1, x 2 ) = x x x 1 s.t. x 1 80 x 1 + x Pre riešenie úlohy vykonáme nasledujúce kroky

enum

1. KOMPLEXNÉ ČÍSLA 1. Nájdite výsledok operácie v tvare x+yi, kde x, y R. a i (5 2i)(4 i) b. i(1 + i)(1 i)(1 + 2i)(1 2i) (1 7i) c. (2+3i) a+bi d

Modem a lokálna sieť LAN Používateľská príručka

Stravné - přecenění

Microsoft Word - Príloha P2 - zadania pracovných listov pre 6. ročník

Poznámky k cvičeniu č. 2

Inteligentné rozhodovacie systémy Heuristické prehľadávanie SP Október, 2018 Katedra kybernetiky

Hranoly (11 hodín) September - 17 hodín Opakovanie - 8. ročník (6 hodín) Mesiac Matematika 9. ročník 5 hodín/týždeň 165 hodín/rok Tematický celok Poče

Digitálne technológie v každodennom živote 3. ročník akademický rok 2019/2020 Harmonogram prednášok

7/1/2015 Úvod do databáz, skúškový test, max 25 bodov, 90 min

Úroveň strojového kódu procesor Intel Pentium Úvod Štruktúra procesorov Intel Pentium Základné inštrukcie Vetvenia a cykly Praktické programovanie jed

Ďalšie vlastnosti goniometrických funkcií

Microsoft Word - 16.kapitola.doc

STREDNÁ ODBORNÁ ŠKOLA POLYTECHNICKÁ Sládkovičova ulica Ruţomberok K r i t é r i á p r i j í m a c i e h o k o n a n i a do nadstavbové štúd

Microsoft Word - pouzivatelska_prirucka.doc

1)

O babirusách

Microsoft Word - prirucka_katedry_nova

Úlohy o veľkých číslach 6. Deliteľnosť In: Ivan Korec (author): Úlohy o veľkých číslach. (Slovak). Praha: Mladá fronta, pp Persistent UR

Študent 1. kapitola Maticová algebra I 1.1 Definícia matice V mnohých prípadoch dáta majú štruktúru dvojrozmernej tabuľky, ktorá má m riadkov a n stĺp

Zakúpili sme mobilný telefón, ktorý budeme splácať v mesačných splátkach spolu s poplatkom za mobilné služby. Prvá faktúra bola vystavená s rozpisom n

NSK Karta PDF

Úvodná prednáška z RaL

DediĊnosť

Import absencí z ASC

Informačná a modelová podpora pre kvantifikáciu prvkov daňovej sústavy SR

2_detsky pesibus v Novakoch_Putiska Ivan

N desitka.indd

1 Portál pre odborné publikovanie ISSN Heuristický adaptívny PSD regulátor založený na miere kmitavosti Šlezárová Alexandra Elektrotechnika

Kolmogorovská zložitost

1)

bakalarska prezentacia.key

Ako v programe zaúčtovať úver, ktorý bol poskytnutý bankou a suma úveru bola pripísaná na podnikateľský bankový účet?

Prehľad matematiky I. ROZDELENIE ČÍSEL 1. Prirodzené N: 1, 2, 3, 4,... a. kladné: 8; 6,3; 5; Celé Z:..., 3, 2, 1, 0, 1, 2, 3... b. záporné: 3;

Aplikace matematiky- záverečná práca Juraj Bodík 28. septembra 2017 Definície Žena - objekt ohodnotený celým číslom. Každé dve ženy sa dajú porovnat a

Sprievodný list SofComs.r.o., Priemyselná 1, Liptovský Mikuláš Program basic.sk Verzia ( ) Dátum Autor Ing. J. Malíček

Relačné a logické bázy dát

9. kapitola Maticová algebra II systém lineárnych rovníc, Frobeniova veta, Gaussova eliminačná metóda, determinanty 1. Systém lineárnych rovníc Systém

SK MATEMATICKÁOLYMPIÁDA skmo.sk 66. ročník Matematickej olympiády 2016/2017 Riešenia úloh domáceho kola kategórie Z9 1. Vo všetkých deviatich políčkac

Prepis:

MATEMATICKÁ OLYMPIÁDA NA STREDNÝCH ŠKOLÁCH 54. ročník, školský rok 2004/2005 Zadania úloh 3. kola kategórie P 1. súťažný deň Na riešenie úloh máte 4.5 hodiny čistého času. Riešenie každého príkladu musí obsahovať (pokiaľ nie je v zadaní uvedené ináč): Popis riešenia, to znamená slovný popis použitého algoritmu, argumenty zdôvodňujúce jeho správnosť (prípadne dôkaz správnosti algoritmu), diskusiu o efektivite vášho riešenia (časová a pamäťová zložitosť). Slovný popis riešenia musí byť jasný a zrozumiteľný i bez nahliadnutia do samotného zápisu algoritmu (do programu). Program. V úlohách P-III-1 a P-III-2 treba uviesť dostatočne podrobný zápis algoritmu, najlepšie v tvare zdrojového textu najdôležitejších častí programu v jazyku Pascal alebo C/C++. Zo zápisu môžete vynechať jednoduché operácie ako vstupy, výstupy, implementáciu jednoduchých matematických vzťahov a pod. Ak vo vašom riešení využívate netriviálne dátové štruktúry alebo algoritmy, ktoré sú obsiahnuté v knižniciach k vášmu programovaciemu jazyku (napr. STL pre C++), súčasťou riešenia by mal byť dostatočne podrobný popis implementácie použitých dátových štruktúr a algoritmov. V úlohe P-III-3 uveďte príslušný program pre Alik-a. Hodnotí se nielen správnosť programu, ale tiež kvalita popisu riešenia a efektivita zvoleného algoritmu. 1

P-III-1 Pánko Lektor je vášnivý zberateľ náhrdelníkov. Náhrdelníky, ktoré zbiera, sa navzájom líšia počtom, poradím a druhmi použitých drahých kameňov. Ako každý zberateľ, ani Lektor nechce vyhadzovať peniaze za náhrdelníky, ktoré už v zbierke má. Vymyslel si preto nasledujúce kódovanie: Každému druhu drahokamov priradil jedno písmeno abecedy. Náhrdelník teraz zapísal tak, že začal od niektorého drahokamu a napísal si kódy všetkých drahokamov v poradí, v akom sa na náhrdelníku nachádzali. Navyše si kúpil stroj, ktorý mu pre daný kód povie, či už taký náhrdelník má v zbierke alebo nie. Klenotníci si však rýchlo všimli slabinu v jeho postupe keď predávaný náhrdelník pootočili, prípadne ho obrátili hore nohami, jeho kód sa tým zmenil. Takto si pánko Lektor nakúpil zopár duplikátov napríklad náhrdelník ABCA si kúpil aj ako AABC a ACBA. Niet divu, že by chcel svoj stroj vylepšiť tak, aby rozoznal aj takéto situácie. Vašou úlohou bude napísať program, ktorý to dokáže. Súťažná úloha: Program dostane na vstupe niekoľko kódov náhrdelníkov x 1,..., x N (1 N 1 000 000). O každom z nich by mal vypísať, či ho má pánko Lektor kúpiť alebo nie podľa toho, či už predtým rovnaký náhrdelník kúpil. Ak je náhrdelník x i rôzny od každého spomedzi náhrdelníkov x 1,..., x i 1 (vrátane ich rotácii a preklápania), mal by byť i-ty riadok výstupu Kup ho!, inak by mal byť i-ty riadok výstupu Ten uz mas. Váš program môže využívať Lektorov starý stroj ako čiernu skrinku, ktorá si vie pamätať množinu kódov náhrdelníkov. Na začiatku behu programu je táto množina prázdna. Vo svojom programe môžete volať funkcie Pridaj a MamHo. Prvá z nich pridá nový kód náhrdelníka do pamätanej množiny, druhá vráti true alebo false (v C/C++ 1 alebo 0) podľa toho, či sme predtým niekedy zavolali Pridaj s daným kódom náhrdelníka. Hlavičky pomocných funkcií: int MamHo (const char *kod); /* v C */ void Pridaj (const char *kod); function MamHo (var kod:string):boolean; { v Pascale } procedure Pridaj (var kod:string); Hodnotenie riešení: Pánko Lektor má nasledujúce požiadavky: Pamäťová zložitosť vášho programu nesmie závisieť od počtu testovaných náhrdelníkov. Časová zložitosť vášho programu by mala byť čo najnižšia. Volania funkcií Pridaj a MamHo majú časovú zložitosť lineárnu od dĺžky reťazca kod. 2

Spomedzi dvoch programov s rovnakou časovou zložitosťou je lepší ten, ktorý potrebuje menej volaní funkcií Pridaj a MamHo. Príklad: vstup ABCA ACBA AABC ABAC výstup Kup ho! Ten uz mas. Ten uz mas. Kup ho! P-III-2 Nedávno bolo otvorené nové Magické Observatórium v Polomokrej chňapke (MO-P). Podnebie v Polomokrej chňapke je také polomokré, preto sa vedenie MO-P rozhodlo, že všetky svoje budovy prepojí krytými nadzemnými mostami. A aby zostalo peňazí aj na iné účely, bolo by vhodné, aby celková dĺžka týchto mostov bola najmenšia možná. Navyše kvôli častým obdobiam, kedy tam fúka silný severák, musia všetky mosty viesť zo severu na juh. Súťažná úloha: Vašou úlohou je navrhnúť algoritmus, ktorý pre zadanú mapu areálu MO-P navrhne najlepšie možné prepojenie budov. Ak sa budovy pospájať nedajú, program by to mal zistiť a podať o tom správu. Mapa areálu MO-P je zadaná ako štvorcová sieť s N riadkami a M stĺpcami. Budovy sú vyznačené znakmi x, okolité močiare bodkami. Ak dve políčka s písmenom x majú spoločnú hranu, patria do tej istej budovy a pracovníci MO-P medzi nimi môžu prejsť. Vašou úlohou je dokresliť do mapy čo najmenej severojužných (t.j. zvislých) mostov tak, aby sa medzi každými dvomi budovami dalo prejsť bez stúpenia do močiara. Políčka mostov sa smú používať len v severojužnom smere, t.j. prísť naň aj odísť z neho smieme len v týchto smeroch. Pri riešení tejto úlohy (a zároveň pri jeho popise) sa sústreďte na efektívne nájdenie optimálneho prepojenia budov a na zdôvodnenie správnosti daného algoritmu. Príklad 1: vstup M = 8, N = 5..xxxxx....x...x...x.x.x....xxx..xx výstup..xxxxx...... x...x.. x.x.x...xxx..xx 3

Vysvetlenie príkladu: Areál je tvorený štyrmi budovami (znaky x v pravom stĺpci patria do inej budovy ako znaky x v prvom riadku). Keďže mosty môžeme používať len v severojužnom smere, je nutné postaviť aj most v pravom stĺpci, bez neho by jedna budova nebola pripojená. Príklad 2: vstup M = 6, N = 5 xxxxxx x...x x.xx.x x...x xxxxxx Príklad 3: vstup M = 5, N = 4 xxx..... xxx.....xx výstup xxxxxx x...x x.xx.x x...x xxxxxx výstup Areal sa neda pospajat. P-III-3 Napíšte program pre Alik-a, ktorý vypočíta dvojkový logaritmus zadaného nenulového čísla x teda pozíciu najľavejšej jednotky, keď x zapíšeme v dvojkovej sústave. (Pozície bitov rastú sprava doľava, napravejší bit je na pozícii 0.) Príklad: Dvojkový logaritmus dvojkového čísla 00110001 je 5, dvojkový logaritmus z 00000001 je 0. Študijný text (Študijný text je rovnaký ako v krajskom kole, len vysvetlenia pri príkladoch boli z typografických príčin skrátené.) Aritmeticko-logická integerová kalkulačka (skratka Alik) je výpočtové zariadenie pracujúce s W -bitovými celými číslami v rozsahu 0 až 2 W 1 vrátane; v ďalšom texte pod číslami rozumieme vždy takéto čísla. Budeme ich obvykle zapisovať v dvojkovej sústave hrubým písmom a na začiatok dvojkového zápisu vždy doplníme príslušný počet núl, aby počet číslic (bitov) bol presne W. Väčšinou tiež nebudeme rozlišovať mezi číslom a jeho dvojkovým zápisom, takže 4

i-tym bitom čísla budeme rozumieť i-ty bit jeho dvojkového zápisu (bity číslujeme zprava doľava od 0 po W 1). Pamäť stroja tvorí 26 registrov pomenovaných a až z. Každý register vždy obsahuje jedno číslo. Alik se riadi programom, čo je postupnosť priraďovacích príkazov typu register := výraz, kde výraz môže obsahovať konštanty (čísla zapísané v dvojkovej sústave), registre, zátvorky a nasledujúce operátory (grécke písmená označujú podvýrazy): α + β (priorita 4) sčíta čísla α a β. Ak je výsledok viac ako 2 W 1, číslice vyšších rádov odreže. Inak povedané, počíta súčet modulo 2 W. α β (priorita 4) odčíta od čísla α číslo β. Ak je α < β, spočíta 2 W + α β, teda rozdiel modulo 2 W. α β (priorita 6) vynásobí dve čísla, výsledok opäť modulo 2 W. α / β (priorita 6) vydelí číslo α číslom β; delenie nulou dá vždy výsledok 0. α % β (priorita 6) vráti zvyšok po delení čísla α číslom β, teda α β (α / β); ak β = 0, výsledok sa rovná α. α (priorita 9) spočíta bitovú negáciu čísla α, čo je číslo, ktorého i-ty bit je 0 práve vtedy, keď i-ty bit čísla α sa rovná 1, a naopak. α β (priorita 8), α β, α β (priorita 7) bitové operácie: and, or a xor. Vyhodnocujú sa tak, že sa i-ty bit výsledku spočíta z i-teho bitu čísla α a i-teho bitu čísla β podľa nasledujúcich tabuliek: 0 0 = 0 0 0 = 0 0 0 = 0 0 1 = 0 0 1 = 1 0 1 = 1 1 0 = 0 1 0 = 1 1 0 = 1 1 1 = 1 1 1 = 1 1 1 = 0 α << β (priorita 2) posunie číslo α o β bitov doľava, teda doplní na jeho koniec β núl a odreže prvých β bitov, aby bol výsledok opäť W -bitový. α >> β (priorita 2) posunie číslo α o β bitov doprava, teda doplní na jeho začiatok β núl a odreže posledných β bitov, aby bol výsledok opäť W - bitový. Ak zátvorky neurčia inak, vyhodnocujú sa operátory s vyššiou prioritou pred operátormi s nižšou prioritou. V rámci rovnakej priority sa vyhodnocuje zľava doprava (s výnimkou operátora, ktorý je unárny, a teda sa musí vyhodnocovať zprava doľava). Príklad: ako fungujú operátory; predpokladáme W = 4 5

a + b c + d = (a + (b c)) + d 0101 + 1110 = 0011 0001 1111 = 0010 0101 0011 = 0001 0101 0011 = 0111 0101 0011 = 0110 Ako vyrobiť pomocou << postupnosť jednotiek: (1 << 11) 1 = 1000 1 = 0111 Ako získať z čohokoľvek samé jednotky: a a = 1111 Výpočet prebieha takto: Najprv sa do registra x nastaví vstup (vždy jedno číslo) a do ostatných registrov nuly. Potom sa vykonajú všetky príkazy register := výraz v poradí, v akom sú v programe uvedené, pričom sa vždy najskôr vyhodnotí výraz na pravej strane a až potom sa jeho výsledok uloží do registra, takže vo vnútri výrazu je ešte možné pracovať s pôvodnou hodnotou registra. Po dokončení posledného príkazu sa hodnota v registri y interpretuje ako výsledok výpočtu. Hodnoty v ostatných registroch môžu byť ľubovoľné. Veľkosť vstupu zadefinujeme ako počet bitov N, ktoré potrebujeme na reprezentáciu vstupu. Naše programy budú často potrebovať registre, do ktorých možno uložiť čísla väčšie ako 2 N 1. Počet bitov, ktoré potrebujeme na reprezentáciu týchto čísel budeme volať veľkosť registra W. Samozrejme, vždy musí platiť W N. Nie vždy je možné použiť ten istý program pre všetky možné veľkosti vstupu N. V závisloti od N a W je napríklad potrebné zmeniť hodnoty pomocných konštánt v programe, počet opakovaní niektorých operácií v programe a podobne. Preto pri riešení úloh pre každú hodnotu N musíme popísať: veľkosť registrov W, ktorú program bude používať, v závislosti od N ako pre každú konkrétnu hodnotu N zostaviť program, ktorý funguje pre všetky vstupy veľkosti N Časovou zložitosťou programu v závislosti od N budeme rozumieť počet inštrukcií, ktoré potrebujeme pre danú veľkosť vstupu. Veľkosť registra W v závislosti od N budeme nazývať pamäťovou zložitosťou (keďže počet registrov je obmedzený na 26, veľkosť registra skutočne určuje množstvo pamäte). Tak ako pri časovej a pamäťovej zložitosti bežných programov, pri odhadoch budeme zanedbávať multiplikatívne konštanty (môžeme teda používať O-notáciu). Budeme však vyžadovať, aby veľkosť registra W bola polynomiálne závislá od veľkosti vstupu N (t.j. existuje konštanta k, pre ktorú W N k pre všetky N 2). Pri riešení úloh budeme chcieť, aby časová zložitosť vygenerovaných programov v závislosti na N bola čo najmenšia. Medzi rovnako rýchlymi programami je potom lepší ten s menšou pamäťovou zložitosťou. Príklad 1: Zostrojte program pre Alik, ktorý dostane na vstupe nenulové číslo a vráti výsledok 1 práve vtedy, ak je toto číslo mocninou dvojky, inak vráti nulu. 6

Riešenie: Vo všetkých ukážkových programoch budeme v ľavom stĺpci uvádzať jednotlivé príkazy a v pravom stĺpci všeobecný tvar spočítanej hodnoty pre ľubovoľné N. Ak sa nejaká číslica alebo skupina číslic opakuje viackrát, označíme opakovanie exponentom. Teda 0 8 je osem núl, (01) 3 je skratka za 010101. Gréckymi písmenami budeme označovať bližšie neurčené skupiny bitov. Zavedieme operáciu r := if (s, t, u), ktorá bude realizovať podmienku: ak s 0, priradí r := t, inak r := u. Spravíme to jednoduchým trikom: rozšíríme si registre o jeden pomocný bit vľavo, nastavíme v r tento bit na jednotku a sledujeme, či sa zmenšením vzniknutého čísla o jednotku tento bit zmení na nulu alebo nie: v := s 10 N v = 1r v := v 1 v = 1r (ak r 0), inak 01 N v := v 10 N v = 10 N alebo 00 N v := v >> N v = 0 N 1 alebo 0 N 0 v := v 1 v = 0 N+1 alebo 1 N+1 r := (u v) (t v) s = t alebo u Potom nasledujúci program rieši zadanú úlohu: x = α10 i a := x 1 a = α01 i b := x a b = α00 i y := if (b, 0, 1) y = 0 alebo 1 Číslo v registri a sa od x vždy líši tým, že najpravejšia 1 sa zmení na 0 a všetky 0 vpravo od nej sa zmenia na 1. Preto b = x a sa musí od x líšiť práve prepísaním najpravejšej 1 na 0. (To preto, že bity naľavo od tejto 1 sú stále rovnaké a α α = α, kým vo zvyšku čísla sa vždy anduje 0 s 1, čo dá nulu.) A keďže mocniny dvojky sú práve čísla, v ktorých dvojkovom zápise je práve jedna 1, spočíta náš program v b nulu práve vtedy, ak je x mocnina dvojky (alebo nula, čo sme ale zakázali). Tým sme dostali program, ktorý rozpoznáva mocniny dvojky v konštantnom čase a používa na to čísla s N + 1 = O(N) bitmi. Príklad 2: Zostrojte program pre Alik, ktorý spočíta binárnu paritu vstupného čísla, teda vráti 0 nebo 1 podľa toho, či má toto číslo párny alebo nepárny počet jednotkových bitov. Riešenie: Bez ujmy na všeobecnosti môžeme predpokladať, že N je mocnina dvoch. Binárna parita P (x) čísla x = x N 1... x 1 x 0 sa podľa definície rovná x 0 x 1... x N 1. Keďže operácia je asociatívna (α (β γ) = (α β) γ) a komutatívna (α β = β α), môžeme tento vzťah preusporiadať na P (x) = (x 0 x N/2 ) (x 1 x N/2+1 )... (x N/2 1 x N 1 ), čo je ale parita čísla, ktoré vznikne vyxorovaním ľavej a pravej polovice čísla x. Takže výpočet parity N-bitového čísla môžeme konštantným počtom príkazov 7

previesť na výpočet parity N/2-bitového čísla, ten zase na výpočet parity N/4- bitového čísla atď., až po log 2 N krokoch na paritu 1-bitového čísla, ktorá sa ovšem rovná číslu samotnému. Paritu teda spočítame nasledujúcim programom. Jeho časová zložitosť tohto programu je O(log N) krokov, pamäťová zložitosť je O(N) bitov. p := x >> N/2 p = horných N/2 bitov x q := x 1 N/2 q = dolných N/2 bitov x x := p q x = N/2-bitové číslo s paritou ako pôvodné x x := (x >> N/4) (x 1 N/4 ) x = N/4-bitové číslo s rovnakou paritou (všimnite si skrátený zápis výrazu)...... x := (x >> 1) (x 1) x = 1-bitové číslo y := x y = x (skopírovať výsledok) Náš programovací jazyk samozrejme žiadne celé časti čísel a podobné operácie nemá, ale to vôbec nevadí, pretože ich vždy používame len na podvýrazy závisiace iba na N, takže ich v programe môžeme pre každé N uviesť ako konštanty. Príklad 3: Vo vzorovom riešení úlohy P-I-4 b) sme potrebovali presunúť postupnosť jednotiek na koniec čísla, teda číslo tvaru 0 i 1 j 0 k previesť na 0 i 0 j 1 k. To je pomocou delenia možné spraviť v konštantnom čase napríklad takto: x = 0 i 1 j 0 k a := x (x 1) a = 0 i 1 j 1 00 k (pozri Príklad 1) b := x a b = 0 i 0 j 1 10 k y := x / b b = 0 i 0 k 1 j Tu sme využili to, že delenie mocninou dvojky je možné použiť ako bitový posun doprava, ale namiesto počtu bitov, o ktoré sa má posúvať, zadáme číslo majúce 1 na pozícii, ktorá sa má po posune objaviť úplne vpravo. SLOVENSKÁ KOMISIA MATEMATICKEJ OLYMPIÁDY 54. ROČNÍK MATEMATICKEJ OLYMPIÁDY Zadania 3. kola kategórie P 1. súťažný deň Vydala IUVENTA pre vnútornú potrebu Ministerstva školstva SR Zodpovedný redaktor: M. Forišek Sadzba programom LATEX c Slovenská komisia Matematickej olympiády, 2005