1012 - aranjare

From Bitnami MediaWiki
Revision as of 08:36, 4 June 2024 by Danciu (talk | contribs) (Pagină nouă: = Cerința = Dorel tocmai a învățat la școală despre permutări. El a reținut faptul că <code>n</code> persoane pot fi aranjate pe <code>n</code> locuri în <code>n!</code> moduri, unde . Pentru a vă pune pe voi la încercare Dorel mai alege un număr <code>p</code> și vă întreabă în câte moduri putem aranja <code>n</code> persoane numerotate de la <code>1</code> la <code>n</code> pe <code>n</code> locuri, numerotate şi ele de la <code>1</code> la <code>n</cod...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Cerința[edit | edit source]

Dorel tocmai a învățat la școală despre permutări. El a reținut faptul că n persoane pot fi aranjate pe n locuri în n! moduri, unde . Pentru a vă pune pe voi la încercare Dorel mai alege un număr p și vă întreabă în câte moduri putem aranja n persoane numerotate de la 1 la n pe n locuri, numerotate şi ele de la 1 la n, astfel încât suma dintre numărul persoanei și numărul locului să fie divizibilă cu p?

Date de intrare[edit | edit source]

Programul citește de la tastatură numerele n și p, separate prin spații.

Date de ieșire[edit | edit source]

Programul va afișa pe ecran numărul m, reprezentând numărul de moduri cerut. Deoarece acest număr ar putea fi foarte mare, rezultatul se va afișa modulo 100019.

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

  • 1 ≤ p ≤ n ≤ 100.000
  • locurile și persoanele sunt numerotate de la 1 la n

Exemplu:[edit | edit source]

Intrare

8 4

Ieșire

16

Explicație[edit | edit source]

Avem 8 persoane și 8 locuri. Persoanele 1 și 5 se pot așeza pe locurile 3 și 7 în 2! moduri, persoanele 2 și 6 pe locurile 2 și 6 în 2! moduri, persoanele 3 și 7 pe locurile 1 și 5 în 2! moduri, iar persoanele 4 și 8 pe locurile 4 și 8 în 2! moduri. În total vom avea 2 4 =16 moduri de aranjare.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3"> MOD = 100019

def count_valid_arrangements(n, p):

   total_arrangements = 0
   dp = [[0 for _ in range(n + 1)] for _ in range(n + 1)]
   dp[1][1] = 1
   for i in range(2, n + 1):
       for j in range(1, n + 1):
           current_arrangements = 0
           if (i + j) % p == 0:
               current_arrangements += dp[i - 1][j]
               if i != j:
                   current_arrangements += dp[i][j - 1]
           dp[i][j] = current_arrangements
   for j in range(1, n + 1):
       total_arrangements += dp[n][j]
   return total_arrangements % MOD

def main():

   n, p = map(int, input().split())
   valid_arrangements = count_valid_arrangements(n, p)
   print(valid_arrangements)

if __name__ == "__main__":

   main()

</syntaxhighlight>