Cod sursa(job #568893)

Utilizator popoiu.georgeGeorge Popoiu popoiu.george Data 31 martie 2011 19:55:23
Problema Pod Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<fstream>
#include<vector>
#include<list>
#define inf "pod.in"
#define outf "pod.out"
#define MOD 9901
#define KMax 30
#define MODH 666013
using namespace std;

fstream f(inf,ios::in),g(outf,ios::out);

int N, M, K;
int A[KMax];

vector<int> H[MODH];

inline int h(int x) { return x%MODH; }

inline void add(int x)
{
	int poz = h(x);
	H[poz].push_back(x);
}

inline bool is_in(int x)
{
	int poz = h(x);
	for(int i=0; i<H[poz].size(); i++)
		if( H[poz][i] == x ) return true;
	return false;
}

void read()
{
	f>>N>>M>>K; int j;
	for(int i=1; i<=M; i++) { f>>j; add(j); }
}

void solve()
{
	int i=0, p1, p, p2; bool start = false;
	while( i<N )
	{	
		p = i%(K+1); A[p] = 0;
		if( is_in(i+1) ) { A[p] = -1; i++; continue; }
		
		if( !start ) A[p] = 1, start = true;
				
		if( i-1<0 ) { i++; continue; }
		p1 = (i-1) % (K+1);
		if( !is_in(i) && A[p1]!=-1 ) A[p] += A[p1];
		
		if( i-K < 0 ) { i++; continue; }
		p2 = (i-K)%(K+1);
		if( !is_in(i-K+1) && A[p2]!=-1 ) A[p] += A[p2];

		//g<<A[p]<<endl;		
		A[p] %= MOD;
		i++;
	}
	
	g<< A[ (N-1)%(K+1) ];
}

int main()
{
	read(); solve();
	f.close(); g.close();
	return 0;
}