4045 - Wl: Difference between revisions

From Bitnami MediaWiki
No edit summary
No edit summary
 
Line 1: Line 1:
== Cerința ==
Kida a descoperit un nou joc, prin care pornind de la un număr oarecare poate ajunge la alte numere prin niște pași simpli: dacă la un moment de timp, T, Kida are numărul W, atunci la momentul de timp T + 1 ea poate să ajungă la orice alt număr L dacă:


*L < W
= Cerința =
*L este divizibil cu W - L
Kida a descoperit un nou joc, prin care pornind de la un număr oarecare poate ajunge la alte numere prin niște pași simpli: dacă la un moment de timp, <code>T</code>, Kida are numărul W, atunci la momentul de timp <code>T + 1</code> ea poate să ajungă la orice alt număr <code>L</code> dacă:
*W este divizibil cu W - L
 
*2 * L ≥ W
* <code>L < W</code>
* <code>L</code> este divizibil cu <code>W - L</code>
* <code>W</code> este divizibil cu <code>W - L</code>
* <code>2 * L ≥ W</code>


Kida are o mulțime de N numere, notată cu D. Acum, ea își pune Q întrebări de tipul: Dacă aș porni la momentul de timp T = 0 și aș avea numărul x, care este momentul de timp minim la care aș putea sa ajung la un număr din mulțimea D folosind regulile jocului descris mai sus? Dacă nu se poate ajunge la niciun număr din mulțimea D, atunci Kida va considera că răspunsul este -1.
Kida are o mulțime de N numere, notată cu D. Acum, ea își pune Q întrebări de tipul: Dacă aș porni la momentul de timp T = 0 și aș avea numărul x, care este momentul de timp minim la care aș putea sa ajung la un număr din mulțimea D folosind regulile jocului descris mai sus? Dacă nu se poate ajunge la niciun număr din mulțimea D, atunci Kida va considera că răspunsul este -1.
Line 20: Line 21:
*Subtask #2: Răspunsul pentru fiecare întrebare este cel mult 2 – alte 20 de puncte
*Subtask #2: Răspunsul pentru fiecare întrebare este cel mult 2 – alte 20 de puncte
*Subtask #3: Fără restricții – alte 70 de puncte
*Subtask #3: Fără restricții – alte 70 de puncte
== Exemplul 1 ==
 
; Intrare
= Exemplu: =
: 2
Intrare
: 3 4
2
: 5
3 4
: 7 8 10 3 64
5
; Ieșire
7 8 10 3 64
: 2
Ieșire
: 1  
2
: 2
1
: 0
2
: 4
0
<br>
4
== Exemplul 2 ==
; Intrare
: 3
: 5 6 7
: 4
: 2 8 11 14
; Iesire
: 3
: 1
: -1
: 3
<br>d
== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line="1">
#4045 - Wl
from collections import deque
def find_divisors(n):
    divisors = set()


    # Adăugăm divizorii primi ai lui n în mulțime
INF = float('inf')
    i = 2
MAX_VAL = 100001
    while i * i <= n:
        if n % i == 0:
            divisors.add(i)
            while n % i == 0:
                n //= i
        i += 1


     if n > 1:
def check_restrictions(n, initial_values, queries):
         divisors.add(n)
     if not (1 <= n <= 100):
        print("Datele nu corespund restrictiilor impuse")
        return False
    if not all(1 <= x <= 100000 for x in initial_values):
         print("Datele nu corespund restrictiilor impuse")
        return False
    if not (1 <= len(queries) <= 100):
        print("Datele nu corespund restrictiilor impuse")
        return False
    if not all(1 <= x <= 100000 for x in queries):
        print("Datele nu corespund restrictiilor impuse")
        return False
    return True


     return divisors
def lee(n, initial_values, queries):
     minim = [INF] * (MAX_VAL + 1)
    q = deque(initial_values)


def min_time_to_reach_d(x, divisors_d):
    for x in initial_values:
    time = 0
        minim[x] = 0


     # Pentru fiecare divizor prim al lui x, calculăm timpul minim
     while q:
    for divisor in divisors_d:
        x = q.popleft()
        while x % divisor == 0 and (x // divisor) % 2 == 0:
        for d in range(1, int(x**0.5) + 1):
            x //= divisor
            if x % d == 0:
            time += 1
                if x + d <= MAX_VAL and minim[x + d] > minim[x] + 1:
                    minim[x + d] = minim[x] + 1
                    q.append(x + d)
                if x + (x // d) <= MAX_VAL and minim[x + (x // d)] > minim[x] + 1:
                    minim[x + (x // d)] = minim[x] + 1
                    q.append(x + (x // d))


     if x > 1:
     results = []
         time += 1
    for x in queries:
 
         if minim[x] == INF:
     return time
            results.append(-1)
        else:
            results.append(minim[x])
   
     return results


def main():
def main():
     # Citirea datelor de intrare
     n = int(input())
    N = int(input())
     initial_values = list(map(int, input().split()))
     D = list(map(int, input().split()))
     q = int(input())
     Q = int(input())
     queries = list(map(int, input().split()))
     questions = list(map(int, input().split()))
 
    # Verificarea restricțiilor
    if not (1 <= N <= 10000 and all(1 <= d <= 100000 for d in D) and 1 <= Q <= 100000 and all(0 <= x <= 100000 for x in questions)):
        print("false")
        return
 
    # Găsirea divizorilor primi ai elementelor din D
    divisors_D = set()
    for number in D:
        divisors_D.update(find_divisors(number))
 
    # Răspuns la fiecare întrebare
    for question in questions:
        # Calculăm timpul minim pentru a ajunge la un număr din D
        time_to_reach_D = min_time_to_reach_d(question, divisors_D)


        if time_to_reach_D == 0:
    if check_restrictions(n, initial_values, queries):
            print(-1)
        results = lee(n, initial_values, queries)
         else:
         for res in results:
             print(time_to_reach_D)
             print(res)


if __name__ == "__main__":
if __name__ == "__main__":

Latest revision as of 16:27, 18 May 2024

Cerința[edit | edit source]

Kida a descoperit un nou joc, prin care pornind de la un număr oarecare poate ajunge la alte numere prin niște pași simpli: dacă la un moment de timp, T, Kida are numărul W, atunci la momentul de timp T + 1 ea poate să ajungă la orice alt număr L dacă:

  • L < W
  • L este divizibil cu W - L
  • W este divizibil cu W - L
  • 2 * L ≥ W

Kida are o mulțime de N numere, notată cu D. Acum, ea își pune Q întrebări de tipul: Dacă aș porni la momentul de timp T = 0 și aș avea numărul x, care este momentul de timp minim la care aș putea sa ajung la un număr din mulțimea D folosind regulile jocului descris mai sus? Dacă nu se poate ajunge la niciun număr din mulțimea D, atunci Kida va considera că răspunsul este -1.

Date de intrare[edit | edit source]

Prima linie a input-ului conține numărul N. Pe a doua linie se află N numere naturale, reprezentând elementele mulțimii D. A treia linie conține numărul Q. Ultima linie va conțin cele Q numere, reprezentând întrebările pe care și le pune Kida.

Date de ieșire[edit | edit source]

Prima linie a input-ului conține numărul N. Pe a doua linie se află N numere naturale, reprezentând elementele mulțimii D. A treia linie conține numărul Q. Ultima linie va conțin cele Q numere, reprezentând întrebările pe care și le pune Kida.

Restricții și precizări[edit | edit source]

  • 1 ≤ N ≤ 10 000
  • 1 ≤ D[i] ≤ 100 000
  • 0 ≤ x ≤ 100 000
  • 1 ≤ Q ≤ 100 000
  • Subtask #1: Răspunsul pentru fiecare întrebare este cel mult 1 – 10 puncte
  • Subtask #2: Răspunsul pentru fiecare întrebare este cel mult 2 – alte 20 de puncte
  • Subtask #3: Fără restricții – alte 70 de puncte

Exemplu:[edit | edit source]

Intrare

2
3 4
5
7 8 10 3 64

Ieșire

2
1
2
0
4

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1"> from collections import deque

INF = float('inf') MAX_VAL = 100001

def check_restrictions(n, initial_values, queries):

   if not (1 <= n <= 100):
       print("Datele nu corespund restrictiilor impuse")
       return False
   if not all(1 <= x <= 100000 for x in initial_values):
       print("Datele nu corespund restrictiilor impuse")
       return False
   if not (1 <= len(queries) <= 100):
       print("Datele nu corespund restrictiilor impuse")
       return False
   if not all(1 <= x <= 100000 for x in queries):
       print("Datele nu corespund restrictiilor impuse")
       return False
   return True

def lee(n, initial_values, queries):

   minim = [INF] * (MAX_VAL + 1)
   q = deque(initial_values)
   for x in initial_values:
       minim[x] = 0
   while q:
       x = q.popleft()
       for d in range(1, int(x**0.5) + 1):
           if x % d == 0:
               if x + d <= MAX_VAL and minim[x + d] > minim[x] + 1:
                   minim[x + d] = minim[x] + 1
                   q.append(x + d)
               if x + (x // d) <= MAX_VAL and minim[x + (x // d)] > minim[x] + 1:
                   minim[x + (x // d)] = minim[x] + 1
                   q.append(x + (x // d))
   results = []
   for x in queries:
       if minim[x] == INF:
           results.append(-1)
       else:
           results.append(minim[x])
   
   return results

def main():

   n = int(input())
   initial_values = list(map(int, input().split()))
   q = int(input())
   queries = list(map(int, input().split()))
   if check_restrictions(n, initial_values, queries):
       results = lee(n, initial_values, queries)
       for res in results:
           print(res)

if __name__ == "__main__":

   main()

</syntaxhighlight>