Cod sursa(job #467032)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 28 iunie 2010 11:03:58
Problema Pod Scor 5
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 1 kb
#include<algorithm>
#include<vector>
using namespace std;
#define MOD 9901
#define MOD1 31
int n,m,k,i,x;
int lipsa[1005];
int ind1,indk,indi;
int a[40];
int main()
{
	freopen("pod.in","r",stdin);
	freopen("pod.out","w",stdout);

	scanf("%d%d%d",&n,&m,&k);

	for(i=1;i<=m;i++)
		scanf("%d",&lipsa[i]);

	sort(lipsa+1,lipsa+m+1);

	if(lipsa[m]==n)
	{
		printf("0\n");
		return 0;
	}

	lipsa[m+1]=(1<<30);

	int t=0;
	ind1=indk=indi=1;
	a[1]=a[k]=1;
	x=3*k;
	for(i=1;i<=n;i++)
	{
		if(lipsa[indi]==i)
		{
			indi++;
			continue;
		}
		int i1=0,ik=0,ii;
		if(i-1>0)
			i1=(i-1)&MOD1;
		if(i-k>0)
			ik=(i-k)&MOD1;
		ii=i&MOD1;
		if(lipsa[ind1]==i-1)
			ind1++;
		else
		{
			a[ii]+=a[i1];
			if(a[ii]>MOD)
				a[ii]-=MOD;
		}

		if(lipsa[indk]==i-k)
			indk++;
		else
		{
			a[ii]+=a[ik];
			if(a[ii]>MOD)
				a[ii]-=MOD;
		}
		if(t==0&&a[ii])
			t=1;
		if(i>x&&t==0)
		{
			printf("0\n");
			return 0;
		}
	}

	printf("%d\n",a[(n&MOD1)]);
	return 0;
}