Hash Table
Posloupnost N celých čísel A = { a1, a2, ..., aN} ukládáme postupně v tomto pořadí do rozptylovací tabulky velikosti L, která je na začátku prázdná. Celkový počet kolizí, které nastanou během vkládání všech prvků A do tabulky, označme PK(L).Pro účely této ulohy považujeme za kolizi každou situaci, kdy máme vypočtenou možnou pozici vkládaného klíče a přitom je tato pozice v tabulce obsazena jiným klíčem. Během procesu vložení jednoho klíče tedy může nastat více kolizí, resp. kolize nastávají tak dlouho, dokud v tabulce není nalezena volná pozice pro vkládaný klíč.
Lze očekávat, že pro dvě různé délky L1 ≠ L2 bude platit PK(L1) ≠ PK(L2). Naší úlohou bude odhalit nejpříznivější a nejméně příznivou délku tabulky pro všechny přípustné hodnoty L z daného intervalu hodnot L1..L2.
Tabulka používá strategii double hashing. Adresa klíče k se vypočte ze vztahu
adresa(k ) = k mod L.
Při kolizi se generují další adresy, kam se zkouší klíč uložit. Další adresy klíče k se vypočtou ze vztahu
adresa(k ) = (k mod L + s *(1 + k mod H1)) mod L, kde s = 1, 2, 3, ...
a kde H1 je daná celočíselná kladná konstanta.
Délka tabulky L je povinně prvočíselná.
Prvky posloupnosti A jsou dány předpisem
ak = (k*B) mod C, (k = 1, 2, .. N),
kde B a C jsou daná kladná celá čísla.
Vstup
Na vstupu jsou dva řádky. Prní řádek obsahuje specifikaci posloupnosti A, což jsou tři celá čísla B, C, N oddělená mezerou. Platí B, C < 1500000. Druhý řádek obsahuje také tři celá čísla L1, L2, H1, také oddělená mezerou, která charakterizují tabulku. L1 představuje dolní mez pro všechny zkoumané přípustné hodnoty L délky tabulky, L2 představuje horní mez. Hodnota H1 je parametr druhé hashovací funkce specifikované výše. Platí 2 ≤ N ≤ L1 ≤ L2 < 110000, interval L1..L2 obsahuje alespoň jednu přípustnou hodnotu L.Výstup
Výstup obsahuje dva řádky. První řádek obsahuje dvě čísla Lmin a Rmin oddělená mezerou. Lmin je délka tabulky, pro níž je hodnota PK(L) minimální pro všechna přípustná L z intervalu L1..L2. Pokud stejný minimální počet kolizí nastal při více různých hodnotách délky L, rovná se Lmin nejmenší z těchto hodnot.Číslo Rmin představuje průměrný počet kolizí na jeden vložený prvek, tj. hodnotu PK(Lmin)/N. Lmin a Rmin jsou odděleny mezerou.
Druhý řádek výstupu je strukturován stejně jako první, hodnoty v něm jsou Lmax a Rmax a týkají se hodnoty L pro níž je PK(L) maximální pro všechna přípustná L z intervalu L1..L2. Pokud stejný minimální počet kolizí nastal při více různých hodnotách délky L, rovná se Lmax největší z těchto hodnot. Číslo Rmax představuje průměrný počet kolizí na jeden vložený prvek, tj. hodnotu PK(Lmax)/N. Lmax a Rmax jsou odděleny mezerou.
Rmin a Rmax mají povinně právě dvě číslice za desetinnou tečkou, před desetinnou tečkou je vždy alespoň jedna číslice.
Příklad 1
Vstup:13 19 9 10 14 5Výstup:
11 0.33 13 0.44
Příklad 2
Vstup:17 19 9 10 20 7Výstup:
11 0.00 19 0.00
Příklad 3
Vstup:997 1009 100 100 200 97Výstup:
151 0.00 103 1.84
Veřejná data k úloze jsou k dispozici. Veřejná data jsou uložena také v odevzdávacím systému a při každém odevzdání/spuštění úlohy dostává řešitel kompletní výstup na stdout a stderr ze svého programu pro každý soubor veřejných dat.