1012 - aranjare
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
lan
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>