Cod sursa(job #467285)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 28 iunie 2010 13:48:34
Problema Pod Scor 5
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 1.14 kb
#include <cstdio>
#include <ctime>
#include <stdlib.h>
#define mod 9901
#define kpart 50
#define NMAX 1005
int n, m, k, a, cnt,i;
int res, dp[NMAX],j, A[NMAX], dpsteps[NMAX], firstk, lastk;
using namespace std;
int main ()
{
	freopen ("pod.in", "r", stdin);
	freopen ("pod.out", "w", stdout);
	scanf ("%d%d%d\n", &n, &m, &k);
	for (i = 1; i <= m; i++) 
	{
		scanf ("%d", &A[i]);
		if (A[i] == n)
		{
			printf ("0\n");
			return 0;
		}
	}
	int CNT = 1;
	firstk = 1;
	lastk = 1;
	dp[0] = 1; int pas = 1, past = 0;
	while (pas <= n)
	{	
		//int aux = pas;
		for (i = CNT; i <= kpart && pas <= n; i++)
		{	
			++pas;
			while (A[firstk] < i - 1 && firstk < m)
			       ++firstk;	
			if (A[firstk] != i - 1 || firstk > m)
				dp[i] = dp[i - 1];
			if (pas - k >= 0 && k != 1)
			{	
				if (i - k == A[lastk] && lastk <= m) ++lastk;
				else
					dp[i] = (dp[i] + dp[i - k]) % mod;
			}
	//			printf ("%d ", dp[i]);
		}
	//	printf (" %d\n", pas);
		if (i <= kpart)
			past = i - 1;
		else past = kpart;
		if (pas > n) break;
			CNT = 0;
		//printf ("%d\n", past);
		for (i = kpart - k; i <= kpart; i++)
			dp[CNT++] = dp[i];
	}
	printf ("%d\n", dp[past] % mod);
	return 0;
}