Cod sursa(job #467422)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 28 iunie 2010 21:05:39
Problema Pod Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define NMAX 1005
#define LMAX 25
#define MOD 9901
using namespace std;
int n,m,k,A[NMAX];
int pos[LMAX][LMAX],poz,rez[LMAX][LMAX],act;
int B[LMAX][LMAX],part[LMAX][LMAX],prep[LMAX][LMAX];
void read()
{
	scanf("%d%d%d",&n,&m,&k);
	int i;
	for (i=1; i<=m; i++)
		scanf("%d",&A[i]);
}
void precompute()
{
	int i;
	for (i=0; i<k; i++)
	{
		pos[1][i+1]=1;
		while (i==A[poz+1])
			pos[1][i+1]=0,poz++;
	}
	act=k-1;
	for (i=1; i<=k; i++)
		prep[i][i]=1;
	for (i=1; i<k; i++)
		B[i+1][i]=1;
	B[1][k]=1; B[k][k]=1;
}
void mul(int A[LMAX][LMAX],int B[LMAX][LMAX])
{
	int i,j,t,C[LMAX][LMAX];
	for (i=1; i<=k; i++)
		for (j=1; j<=k; j++)
		{
			C[i][j]=0;
			for (t=1; t<=k; t++)
			{
				C[i][j]+=A[i][t]*B[t][j];
				if (C[i][j]>=MOD)
					C[i][j]%=MOD;
			}
		}
	memcpy(A,C,sizeof(C));
	for (i=1; i<=k; i++)
		for (j=1; j<=k; j++)
			A[i][j]=C[i][j];
}
void lgput(int exp)
{
	int part[LMAX][LMAX];
	memcpy(rez,prep,sizeof(prep));
	memcpy(part,B,sizeof(B));
	while (exp)
	{
		if (exp & 1)
			mul(rez,part);
		mul(part,part);
		exp>>=1;
	}
}
void solve()
{
	int i;
	for (i=poz+1; i<=m; i++)
	{
		lgput(A[i]-act);
		mul(pos,rez);
		pos[1][k]=0;
		act=A[i];
	}
	lgput(n-act);
	mul(pos,rez);
	printf("%d\n",pos[1][k]);
}
int main()
{
	freopen("pod.in","r",stdin);
	freopen("pod.out","w",stdout);
	read();
	sort(A+1,A+m+1);
	precompute();
	solve();
	return 0;
}