287
Cerința
Se dau două numere naturale N şi K. Determinaţi numărul de şiruri de lungime N formate doar din semnele + şi – şi în care nu apar K semne – pe poziţii consecutive.
Date de intrare
Fișierul de intrare minusk.in conţine pe prima linie 2 numere naturale separate printr-un spaţiu, N şi K, cu semnificaţia din enunţ.
Date de ieșire
Fișierul de ieșire minusk.out va conține pe prima linie un singur număr natural reprezentând valoarea cerută, modulo 2011.
Restricții și precizări
1 ≤ K ≤ N ≤ 1000000;- pentru
30%dintre testeN ≤ 10 - pentru
70%dintre testeN ≤ 1000
Exemplu
minusk.in
4 2
minusk.out
8
Explicație
Cele 8 şiruri sunt: ++++, +++-, ++-+, +-++, -+++, +-+-, -++-, -+-+. În niciunul dintre aceste şiruri nu avem două sau mai mult de două caractere – pe poziţii consecutive.
#include <bits/stdc++.h>
using namespace std;
ifstream cin("minusk.in");
ofstream cout("minusk.out");
int n , k , m[1000001] , p[1000001];
int main()
{
cin >> n >> k;
p[0] = p[1] = m[1] = 1;
for(int i = 2 ; i <= n ; i++)
{
p[i] = m[i] = (m[i - 1] + p[i - 1]) % 2011;
if(i >= k)
{
if(m[i] > p[i - k]) m[i] = (m[i] - p[i - k]) % 2011;
else m[i] = (m[i] + 2011 - p[i - k]) % 2011;
}
}
cout << (m[n] + p[n]) % 2011;
return 0;
}
Comentarii