Cod sursa(job #467319)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 28 iunie 2010 14:08:00
Problema Pod Scor 5
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 1.17 kb
#include <cstdio>
#include <ctime>
#include <stdlib.h>
#include <algorithm>
#define mod 9901
#define kpart 60
#define NMAX 1010
int n, m, k, a, cnt,i;
int res, dp[NMAX],j, A[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;
		}
	}
	random_shuffle (A + 1, A + m + 1);
	sort (A + 1, A + m + 1);
	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++)
		{	
			while (A[firstk] < pas && firstk <= m) ++firstk;
			if (A[firstk] != pas)
			{	
				dp[i] = dp[i - 1];
				if (pas - k >= 0 && k != 1)
				{	
					dp[i] = dp[i] + dp[i - k];
					while (dp[i] > mod) dp[i] -= mod;
					while (dp[i] < 0) dp[i] += mod;
				}
				
			}
			past = i;
//			printf ("%d ", dp[i]);
			++pas;
		}
	//	printf (" %d\n", pas);
		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;
}