5 - Nagrade
Vremensko ograničenje | Memorijsko ograničenje |
---|---|
1000ms | 128MB |
Kao što se inače često dešava u takmičarskim zadacima, našli ste se u čudnoj situaciji: dato vam je \(N\) gomila novčića (\(i\)-ta gomila sadrži \(A_i\) novčića). Planirate da organizujete \(N\) takmičenja, gde ćete za svako od njih iskoristiti jednu gomilu kao nagradni fond (\(A_1\) za prvo, \(A_2\) za drugo, i tako dalje).
Za svako takmičenje treba da odaberete koliko će učesnika biti nagrađeno (obeležićemo broj nagrađenih na \(i\)-tom takmičenju sa \(B_i\)). Sve nagrade na jednom takmičenju su iste, tako da \(A_i\) mora biti deljivo sa \(B_i\). Dodatno, sve vrednosti \(B_i\) moraju biti prosti brojevi (niste sigurni zašto, ali neko vam je rekao da je to dobra ideja).
Da bi ciklus takmičenja bio interesantniji, planirate da odaberete vrednosti \(B_i\) tako da su nagrade na svim takmičenjima različite, tj. da za svaki par vrednosti \((i,j)\) važi \(\frac{A_i}{B_i} \neq \frac{A_j}{B_j}\). Vaš zadatak je da napišete program koji će pronaći ovakvu podelu ili utvrditi da to nije moguće.
Opis ulaza
U prvom redu standardnog ulaza nalazi se jedan ceo broj \(N\) -- broj takmičenja koja organizujete. U drugom redu nalazi se \(N\) brojeva \(A_1, A_2, \ldots, A_N\), koji predstavljaju broj novčića u nagradnim fondovima pojedinačnih takmičenja.
Opis izlaza
U prvom i jedinom redu standardnog izlaza ispisati \(N\) brojeva \(B_1, B_2, \ldots, B_N\) -- broj nagrađenih takmičara na svakom takmičenju, tako da su uslovi iz teksta zadatka zadovoljeni. Ukoliko to nije moguće, ispisati \(-1\).
Ukoliko postoji više rešenja, ispisati bilo koje.
Primer 1
Ulaz
Izlaz
Primer 2
Ulaz
Izlaz
Objašnjenje primera
U prvom primeru, jedno moguće rešenje je da se na prvom takmičenju dodele dve nagrade od po \(5\) novčića, na drugom dve od po \(4\), na trećem pet od po \(3\) i na četvrtom sedam nagrada od po jednog novčića. Pošto su sve nagrade različite, i na svakom takmičenju je nagrađen prost broj takmičara, ova podela zadovoljava date uslove. Moguća su i druga rešenja, na primer da se na prvom takmičenju nagradi pet, a na trećem tri takmičara.
U drugom primeru, jedino rešenje gde je nagrađen prost broj takmičara je 2 7
(jer \(1\) nije prost broj). Kako su na njemu nagrade na oba takmičenja iste (po jedan novčić), ono ne zadovoljava sve uslove, tako da ne postoji rešenje.
Ograničenja
- \(1 \leq N\).
- \(1 \leq A_i\).
Test primeri su podeljeni u tri disjunktne grupe:
- U test primerima koji vrede \(20\) poena važi \(N \leq 8, A_i \leq 1000\).
- U test primerima koji vrede \(20\) poena važi \(N \leq 1000, A_i \leq 3000\).
- U test primerima koji vrede \(60\) poena važi \(N \leq 1000, A_i \leq 200000\).
Autor | Tekst i test primeri | Analiza rеšenja | Testiranje |
---|---|---|---|
Boris Grubić | Dimitrije Erdeljan | Dimitrije Erdeljan | Ivan Stošić |
Prvo, za svaki broj sa ulaza nađimo sve različite proste brojeve koji ga dele. Ovo se može uraditi efikasno pomoću modifikacije Eratostenovog sita, kojom se svaki broj \(x < M\) može faktorizovati u logaritamskoj složenosti, gde je \(M\) gornja granica za Eratostenovo sito.
Ovih različitih prostih brojeva ima ne više od \(6\), jer je proizvod najmanjih \(7\) prostih brojeva veći od \(2 \times 10^5\). Sada, za svaki broj nađimo količnik njega i svakog različitog prostog broja koji ga deli. Neka je za \(i\)-ti broj \(P_i\) lista njegovih različitih prostih delilaca a \(C_i\) lista koja se dobija kada se \(A_i\) podeli sa svakim elementom liste \(P_i\). Cilj zadatka je da nađemo niz različitih brojeva \(B\) tako da je za svako \(i\), \(B_i = A_i / P_{i, j} = C_{i, j}\) za neko \(j\). Ovaj problem je poznat i pod nazivom sistem različitih predstavnika familije skupova \(C\). Ovo se može rešiti u polinomijalnom vremenu tako što se predstavi kao bipartitni graf, gde su čvorovi sa leve strane indeksi iz originalnog niza, a sa desne strane količnici. Za svako \(i\) dodajemo granu od čvora \(i\) sa leve strane do čvorova \(C_{i, j}\) sa desne, za svako \(j\). Svaki sistem različitih predstavnika sada odgovara jednom perfektnom sparivanju (mečingu) u ovom grafu, odnosno mečingu gde je svaki čvor sa leve strane sparen. Dakle želimo da ispitamo da li ovako dobijen graf ima mečing sa \(N\) grana i koji je to mečing.
Najjednostavniji i najpoznatiji algoritam jeste Ford-Fulkersonov algoritam koji radi u složenosti \(O(VE)\), gde je \(V\) broj čvorova, a \(E\) broj grana u grafu, što u našem slučaju, zbog gore pomenutog ograničenja na broj grana iznosi \(O(N^2)\). Primetimo da ne moramo da dodajemo sve čvorove sa desne strane već samo one koji se bar jednom pojavljuju kao količnici.
05_nagrade.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 |
|