3982 - Descp2

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Considerăm trei numere naturale nenule: n, k şi x. Denumim o kx-descompunere a numărului n o posibilitate de a scrie numărul n ca sumă de k numere naturale nenule astfel încât diferenţa între oricare doi termeni ai sumei este cel puţin egală cu x.

Cerința

Fiind date trei numere naturale n, k şi x, să se determine câte kx-descompuneri distincte există. Două kx-descompuneri sunt distincte dacă diferă prin cel puţin un termen.

Date de intrare

Fișierul de intrare kx_desc.in conține pe prima linie trei valori naturale nenule reprezentând numerele n, k şi x.

Date de ieșire

Fișierul de ieșire kx_desc.out va conține o singură valoare reprezentând restul împărţirii numărului de kx-descompuneri distincte la numărul 10007.

Restricții și precizări

Pentru 20% din teste 0 < n ≤ 200; pentru celelalte 80% din teste, 200 < n ≤ 10000; 1 ≤ x, k ≤ n ==Exemplul 1==: kx_desc.in

20 2 3 kx_desc.out

8

Explicație

Numărul de kx-descompuneri în acest caz este 8. Acestea sunt formate din numerele 1 şi 19; 2 şi 18; 3 şi 17; 4 şi 16; 5 şi 15; 6 şi 14; 7 şi 13; 8 şi 12.

==Exemplul 2==: kx_desc.in

2000 19 7 kx_desc.out

3184

Rezolvare

MOD = 10007

def kx_descompuneri(n, k, x):

   dp = [[0] * (x + 1) for _ in range(n + 1)]
   dp[0][0] = 1
   for i in range(1, n + 1):
       for j in range(1, min(i, k) + 1):
           for l in range(x + 1):
               dp[i][l] = (dp[i][l] + dp[i - j][l - 1]) % MOD
   rezultat = 0
   for i in range(n - k * x + 1, n + 1):
       rezultat = (rezultat + dp[i][x]) % MOD
   return rezultat
if __name__ == "__main__":

   # Citim datele de intrare
   n, k, x = map(int, input().split())
   # Calculăm rezultatul și îl afișăm
   rezultat = kx_descompuneri(n, k, x)
   print(rezultat)
python kx_desc.py < kx_desc.in