Az I/S. 17. feladat (2017. április) |
I/S. 17. Julcsi és Marcsi egy szabályos dobókockával (a szemközti oldalakon levő pontok összege mindig 7) játszanak egy \(\displaystyle S\cdot O\) cellából álló négyzetrácson. A négyzetrács egy cellája pontosan akkora, mint a dobókocka egy oldallapja. A rács bal felső cellájára teszik le a dobókockát úgy, hogy az oldalai párhuzamosak a rács oldalaival, felfele az egyes szám, a tőle jobbra levő oldalon a hármas, a tőle lefele levő cella felé pedig a kettes néz.
Jobbra végiggörgetik a kockát a rácson, míg el nem éri az utolsó cellát, ekkor lefelé gördítik a következő sorba, majd balra vissza addig, míg el nem érik a bal oldalát a rácsnak. Itt újra lefelé gördítenek rajta egyet, s ezeket a lépéseket ismétlik mindaddig, míg az összes cellát be nem járta a kocka. Minden lépés után megnézik, hogy hányas szám van a kocka tetején, és az így megnézett számokat összeadják. Mennyi lesz az összeg?
A bemenet egyetlen sorában két pozitív egész szám áll, \(\displaystyle S\) és \(\displaystyle O\) (\(\displaystyle 1 \le S, O \le 100\,000\)), a négyzetrács sorainak és oszlopainak a száma. A kimenet első és egyetlen sora a kapott összeget tartalmazza.
Az első 4 tesztesetben (4 pontért) \(\displaystyle 1 \le S, O \le 100\).
Példa:
Bemenetek | Kimenetek |
3 2 | 19 |
3 4 | 42 |
737 296 | 763532 |
Beküldendő egy tömörített is17.zip állományban a program forráskódja (az .exe és más, a fordító által generált állományok nélkül), valamint a program rövid dokumentációja, amely leírja a megoldás menetét és megadja, hogy a forrás mely fejlesztői környezetben fordítható.
Megjegyzés: Megoldható-e a feladat akkor is, ha nincs korlát \(\displaystyle S\)-re és \(\displaystyle O\)-ra, csak annyit tudunk, hogy a megoldás \(\displaystyle 10^{18}\)-nál kisebb?
(10 pont)
A beküldési határidő 2017. május 10-én LEJÁRT.
A feladat megoldásához egy könnyen implementálható modellt kell találnunk a kocka tárolására, illetve a gördítés műveletek megvalósítására.
Sok jó választás lehet, a minta megoldás két 4-elemű tömböt használ; az egyik a felső-bal-alsó-jobb, a másik pedig a felső-első-alsó-hátsó oldalakat tárolja. Ekkor a gördítés az egyik tömb ciklikus forgatását (vagyis az 1-5-6-2 tömb 2-1-5-6 lesz a forgatás után), illetve a másik tömb 0. és 2. elemeinek frissítését foglalja magában.
Ezzel megoldható volt a részfeladat:
A teljes megoldáshoz azt kellett még észrevenni, hogy a kockának csak 24 (vagyis véges számú) pozíciója van, ezért egy idő után amikor egy sor elején jobbra indulunk, ugyanazokon a pozíciókon fogunk végigmenni, mint az indulásnál. Ez azt is jelenti, hogy ha egy \(\displaystyle x\) sor hosszú minta ismétlődik, ahol minden iterációval az összeg \(\displaystyle y\)-nal nő, akkor az első \(\displaystyle S - (S \mod x)\) sorban összesen \(\displaystyle S \div x\) alkalommal adunk \(\displaystyle y\)-t az összeghez, vagyis a teljes összeg \(\displaystyle (S \div x) \cdot y + M\) lesz, ahol \(\displaystyle M\) az utolsó \(\displaystyle S \mod x\) sorban elért összeg. Mivel 24 féle pozíciót vehet fel a kocka, ezért ez konstans számú sort jelent, így ez a megoldás a sorok számában konstans \(\displaystyle O(O)\).
Megjegyzés: amennyiben az összeget tudjuk tárolni, a minta egy-egy soron belül is ismétlődik, így a feladat \(\displaystyle O(1)\) időben is megoldható, bár ez nem volt szükséges a 10 pont megszerzéséhez.
Statisztika:
12 dolgozat érkezett. 10 pontot kapott: Busa 423 Máté, Gáspár Attila, Janzer Orsolya Lili, Kiss Gergely, Molnár Bálint, Nagy Nándor, Németh 123 Balázs, Noszály Áron, Szakály Marcell. 7 pontot kapott: 1 versenyző. 6 pontot kapott: 1 versenyző. 5 pontot kapott: 1 versenyző.
A KöMaL 2017. áprilisi informatika feladatai