Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Bitnami MediaWiki
Search
Search
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
1116 – Karb
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
În perioada Campionatului Mondial din Brazilia se preconizează o creştere a traficului de cafea. Se ştie că sunt <code>N</code> orase, conectate prin <code>N-1</code> străzi bidirecţionale, astfel încât se poate ajunge din orice oraş în altul. În prezent există <code>K</code> carteluri de cafea aflate în oraşe distincte, care își exercita influența în propriul oraș. Se ştie că fiecare din aceste carteluri doreşte să-şi extindă influenţa în oraşele vecine. Astfel, la un moment de timp, un cartel poate să-şi extindă influenţa într-un oraş vecin doar dacă acesta nu se află sub influenţa altui cartel. O dată ce un cartel îşi extinde influenta asupra unui nou oraş, cartelul îşi poate extinde influenţa şi în oraşele vecine acestuia. Se ştie că până la începerea campionatului mondial, fiecare oraş va fi sub influenţa unui cartel. ABIN (Agência Brasileira de Inteligência) doreşte să afle în câte moduri poate fi dominată ţara de influenţele celor <code>K</code> carteluri la data începerii campionatului mondial, modulo <code>666013</code>. = Cerință = Cunoscând numărul de orașe <code>N</code>, modul în care acestea sunt conectate, numărul de carteluri inițiale <code>K</code> și cele <code>K</code> orașe în care se află cartelurile, să se determine numărul de moduri în care ţara poate fi împărţită între cartelurile de cafea, modulo <code>666013</code>. = Date de intrare = Fișierul de intrare <code>karb.in</code> conține pe prima linie două numere naturale <code>N</code> şi <code>K</code>, reprezentând numărul de oraşe, respectiv numărul cartelurilor existente iniţial. Pe a doua linie din fişier se vor afla <code>K</code> numere, reprezentând oraşele în care se află cele <code>K</code> carteluri. Pe următoarele <code>N-1</code> linii se vor afla câte două numere naturale, reprezentând o legătură între cele două oraşe. = Date de ieșire = Fișierul de ieșire <code>karb.out</code> va conține pe prima linie un singur număr natural reprezentând numărul de moduri modulo <code>666013</code>. = Restricții și precizări = * <code>1 ≤ K ≤ N ≤ 100 000</code> * Pentru teste în valoare de 10% din punctaj se garantează că <code>k ≤ n ≤ 7</code>, iar pentru alte 20% din teste se garantează că <code>k = 2</code>. * Două oraşe sunt vecine dacă există o stradă bidirecțională între ele. = Exemplu: = <code>karb.in</code> 6 3 3 4 5 1 2 1 3 2 4 2 5 4 6 <code>karb.out</code> 5 = Explicație = Cele <code>5</code> moduri posibile: # <code>(3) (1, 2, 5) (4, 6)</code> # <code>(3, 1) (2, 5) (4, 6)</code> # <code>(3, 1, 2) (5) (4, 6)</code> # <code>(3, 1) (5) (2, 4, 6)</code> # <code>(3) (5) (1, 2, 4, 6)</code> == Rezolvare == <syntaxhighlight lang="python3"> import sys from collections import defaultdict, deque MOD = 666013 def dfs(nod, G, special, viz, T, D): viz[nod] = True sons = 0 for fiu in G[nod]: if viz[fiu]: continue sons += 1 T[fiu] = nod dfs(fiu, G, special, viz, T, D) if sons == 0: if special[nod]: D[nod][0] = 0 D[nod][1] = 1 else: D[nod][0] = 1 D[nod][1] = 0 return localD = [[1] * (sons + 1), [0] * (sons + 1)] ind = 0 for fiu in G[nod]: if T[fiu] != nod: continue ind += 1 localD[0][ind] = (localD[0][ind - 1] * (D[fiu][0] + D[fiu][1])) % MOD localD[1][ind] = (localD[0][ind - 1] * D[fiu][1] + localD[1][ind - 1] * (D[fiu][0] + D[fiu][1])) % MOD if not special[nod]: D[nod][0] = localD[0][ind] D[nod][1] = localD[1][ind] else: D[nod][0] = 0 D[nod][1] = localD[0][ind] def main(): sys.stdin = open("karb.in", "r") sys.stdout = open("karb.out", "w") n, k = map(int, sys.stdin.readline().split()) special = [0] * (n + 1) viz = [False] * (n + 1) T = [0] * (n + 1) D = [[0, 0] for _ in range(n + 1)] G = defaultdict(list) cartel_cities = list(map(int, sys.stdin.readline().split())) for x in cartel_cities: special[x] = x for _ in range(n - 1): x, y = map(int, sys.stdin.readline().split()) G[x].append(y) G[y].append(x) dfs(1, G, special, viz, T, D) print(D[1][1]) if __name__ == "__main__": main() </syntaxhighlight>
Summary:
Please note that all contributions to Bitnami MediaWiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Bitnami MediaWiki:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Toggle limited content width