Cod sursa(job #467170)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 28 iunie 2010 12:31:30
Problema Pod Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 1.15 kb
#include<cstdio>
#include<algorithm>
#include<bitset>
using namespace std;
#define MOD 9901
int N,M,K,rez,unu, nr,aux,tot;
int v[1001];
//bitset<1000021> viz;
bool viz[1000021];

void caz0(int N)
{
	int i;
	rez=1;
	if (N>1)
		rez+=N-K+1;
	if (rez>=MOD)
		rez%=MOD;
	for (i=2; i*K<=N; ++i)
	{
		unu=N-i*K;
		if (unu!=1&&unu)
		{
		nr=unu+i;
		aux=((nr%MOD)*((nr-1)%MOD))/2;
		if (aux>=MOD)
			aux%=MOD;
		rez+=aux;
		if (rez>=MOD)
			rez-=MOD;
		}
		else
			if (unu&&K!=N-1)
		{
			rez+=N/K+1;
			if (rez>=MOD)
				rez%=MOD;
		}
			else
			{
				++rez;
				if (rez>=MOD)
					rez-=MOD;
			}
	}
}
void back(int p)
{
	if (p>v[M])
	{
		caz0(N-p);
		tot+=rez;
		if (rez>=MOD)
			rez-=MOD;
		return;
	}
	if (!viz[p+1])
		back(p+1);
	if (!viz[p+K])
		back(p+K);
}
int main()
{
	freopen("pod.in","r",stdin);
	freopen("pod.out","w",stdout);
	scanf("%d%d%d",&N,&M,&K);
	for (int i=1; i<=M; ++i)
		scanf("%d",&v[i]);
	if (M==0)
	{
		caz0(N);
		printf("%d",rez);
		return 0;
	}
	sort(v+1,v+1+M);
	if (v[M]<=1000000)
	{
		for (int i=1; i<=M; ++i)
			viz[v[i]]=1;
	}
	back(0);
	printf("%d",tot);
	return 0;
}