4194 - EchipaFB: Difference between revisions

From Bitnami MediaWiki
No edit summary
 
(2 intermediate revisions by the same user not shown)
Line 26: Line 26:
:-10 7
:-10 7
;Iesire
;Iesire
;Datele introduse nu corespund restrictiilor impuse
:Datele introduse nu corespund restrictiilor impuse
 


== Rezolvare ==
== Rezolvare ==


<syntaxhighlight lang="python3" line="1">
<syntaxhighlight lang="python3" line="1">
MOD = 998244353
MODULO = 998244353


def comb(n, k):
def este_input_valid(F, B):
     # Calculează coeficientul binomial C(n, k) % MOD folosind metoda combinatorică modulară
     return 1 <= F <= 100000 and 1 <= B <= 100000
    result = 1
    for i in range(1, k + 1):
        result = (result * (n - i + 1) * pow(i, -1, MOD)) % MOD
    return result


def count_ways(F, B):
def calculeaza_moduri(F, B):
     # Calculăm numărul de moduri pentru fiecare K de la 1 la F+B
     rezultate = []
     for K in range(1, F + B + 1):
    total_elevi = F + B
         # Numărul de moduri în care putem forma o echipă cu un număr impar de fete
 
        # este dat de suma combinărilor C(F, i) * C(B, K - i) pentru i de la 1 la min(K, F)
     for K in range(1, total_elevi + 1):
        ways = 0
         moduri = 0
         for i in range(1, min(K, F) + 1, 2):
         for numar_fete in range(1, min(K, F) + 1, 2):
             ways = (ways + comb(F, i) * comb(B, K - i)) % MOD
             numar_baieti = K - numar_fete
       
            if numar_baieti <= B:
         print(ways)
                moduri += 1
 
         rezultate.append(moduri % MODULO)
 
    return rezultate


if __name__ == "__main__":
if __name__ == "__main__":
     # Citim numerele F și B de la tastatură
     # Citire date de intrare
     F = int(input("Introduceți numărul de fete (F): "))
     F = int(input("Introduceți numărul de fete (F): "))
     B = int(input("Introduceți numărul de băieți (B): "))
     B = int(input("Introduceți numărul de băieți (B): "))


     # Calculăm și afișăm rezultatele
     # Verificare validitate date de intrare
    count_ways(F, B)
    if not este_input_valid(F, B):
        print("Datele introduse nu corespund restricțiilor impuse.")
    else:
        # Calcul și afișare rezultate
        rezultate = calculeaza_moduri(F, B)
        for K, moduri in enumerate(rezultate, start=1):
            print(f"Pentru K = {K}, numărul de moduri este: {moduri}")
 


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 11:24, 29 December 2023

Cerinta[edit | edit source]

Într-o şcoală sunt F fete şi B băieţi. Pentru fiecare valoare a lui K de la 1 la F+B, aflaţi în câte moduri se poate alcătui o echipă formată din K elevi, care să conţină un număr impar de fete.

Date de intrare[edit | edit source]

Programul citește de la tastatură numerele F şi B.

Date de iesire[edit | edit source]

Programul va afișa pe ecran, pentru fiecare K de la 1 la F+B, numărul de moduri în care putem forma echipa, modulo 998244353.

Restrictii si precizari[edit | edit source]

  • 1 ⩽ F,B ⩽ 100.000

Exemplul 1[edit | edit source]

Intrare
3 2
Iesire
Datele introduse corespund restrictiilor impuse
3 6 4 2 1

Exemplul 2[edit | edit source]

Intrare
-10 7
Iesire
Datele introduse nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> MODULO = 998244353

def este_input_valid(F, B):

   return 1 <= F <= 100000 and 1 <= B <= 100000

def calculeaza_moduri(F, B):

   rezultate = []
   total_elevi = F + B
   for K in range(1, total_elevi + 1):
       moduri = 0
       for numar_fete in range(1, min(K, F) + 1, 2):
           numar_baieti = K - numar_fete
           if numar_baieti <= B:
               moduri += 1
       rezultate.append(moduri % MODULO)
   return rezultate

if __name__ == "__main__":

   # Citire date de intrare
   F = int(input("Introduceți numărul de fete (F): "))
   B = int(input("Introduceți numărul de băieți (B): "))
   # Verificare validitate date de intrare
   if not este_input_valid(F, B):
       print("Datele introduse nu corespund restricțiilor impuse.")
   else:
       # Calcul și afișare rezultate
       rezultate = calculeaza_moduri(F, B)
       for K, moduri in enumerate(rezultate, start=1):
           print(f"Pentru K = {K}, numărul de moduri este: {moduri}")


</syntaxhighlight>

Explicatie[edit | edit source]

Să notăm cu A,B,C fetele şi cu X,Y băieţii. Pentru K=1 echipele pot fi A, B, respectiv C. Pentru K=2: AX, AY, BX, BY, CX, CY. Pentru K=3: AXY, BXY, CXY, ABC. Pentru K=4: ABCX, ABCY. Pentru K=5: ABCXY.