1022 - Fractii 2

From Bitnami MediaWiki

Enunt[edit | edit source]

Numărul 1 poate fi scris în diverse moduri ca sumă de fracţii cu numărătorul 1 şi numitorul o putere a lui 2. De exemplu:

1 = 1/2 + 1/2 = 1/2 + 1/4 + 1/8 + 1/8 = 1/8 + 1/4 + 1/2 + 1/8

Două scrieri nu sunt considerate distincte dacă folosesc aceleaşi fracţii scrise în altă ordine. În exemplul de mai sus ultimele două scrieri nu sunt distincte.

Cerinţa[edit | edit source]

Pentru N – număr natural nenul să se determine: a) O modalitate de scriere a numărului 1 ca sumă de exact N fracţii cu numărătorul 1 şi numitorul o putere a lui 2. b) Numărul de scrieri distincte a numărului 1 ca sumă de exact N fracţii cu numărătorul 1 şi numitorul o putere a lui 2. Deoarece acest număr poate fi foarte mare acest număr trebuie calculat modulo 100003.

Date de intrare[edit | edit source]

Fişierul de intrare fractii2.in conţine pe prima linie un număr natural p. Pentru toate testele de intrare, numărul p poate avea doar valoarea 1 sau valoarea 2. Pe a doua linie se găseşte un singur număr N natural – reprezentând numărul de fracţii

Date de ieșire[edit | edit source]

Dacă valoarea lui p este 1, se va rezolva numai punctul a) din cerinţă. În acest caz, în fişierul de ieşire fractii2.out se vor scrie, pe o singură linie, N numere naturale separate prin câte un spaţiu reprezentând cei N exponenţi ai lui 2 din scrierea solicitată în prima cerinţă. Astfel, dacă numerele afişate sunt m1,m2,…,mn

atunci există scrierea 1=12m1+12m2+…+12mn
.

Dacă valoarea lui p este 2, se va rezolva numai punctul b) din cerinţă. În acest caz, în fişierul de ieşire fractii2.out se va scrie un număr natural reprezentând răspunsul la a doua cerinţă, adică numărul de scrieri distincte a numărului 1 ca sumă de N fracţii cu numărătorul 1 şi numitorul o putere a lui 2 (modulo 100003).

Restricţii

Restricţii şi precizări[edit | edit source]

  • 2 ≤ N ≤ 2000
  • Pentru prima cerinţă se acordă 20% din punctaj.
  • Pentru a doua cerinţă de acordă 80% din punctaj.
  • Rezultatul pentru a doua cerinţă trebuie afişat modulo 100003

Exemplul 1[edit | edit source]

fractii2.in
1
4
fractii2.out
 2 2 2 2


Exemplul 2[edit | edit source]

fractii2.in
 2 
 4
fractii2.out
2

Explicaţie[edit | edit source]

Primul exemplu:

1 = 1/2 + 1/4 + 1/8 + 1/8 = 1/4 + 1/4 + 1/4 + 1/4 Răspunsul corespunde celei de-a doua scrieri dar există şi alte variante corecte de răspuns. De exemplu, 3 1 2 3 se consideră răspuns corect. Atenţie! Pentru acest test se va afişa doar rezultatul la cerinţa a).


Al doilea exemplu:

1 = 1/2 + 1/4 + 1/8 + 1/8 = 1/4 + 1/4 + 1/4 + 1/4

Acestea sunt singurele scrieri distincte. Atenţie! Pentru acest test se va afişa doar rezultatul la cerinţa b).

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def write_fractions(N):

   exponents = [1] * N
   return exponents

def count_distinct_writings(N):

   MOD = 100003
   if N == 2:
       return 1
   dp = [0] * (N + 1)
   dp[0] = 1
   for i in range(1, N):
       for j in range(i, N + 1):
           dp[j] = (dp[j] + dp[j - i]) % MOD
   return dp[N]

def main():

   with open("fractii2.in", "r") as fin:
       p = int(fin.readline())
       N = int(fin.readline())
   if p == 1:
       with open("fractii2.out", "w") as fout:
           exponents = write_fractions(N)
           fout.write(" ".join(map(str, exponents)))
   elif p == 2:
       with open("fractii2.out", "w") as fout:
           distinct_writings = count_distinct_writings(N)
           fout.write(str(distinct_writings % 100003))

if __name__ == "__main__":

   main()

</syntaxhighlight>