Pagini recente » Cod sursa (job #2656054) | Cod sursa (job #690406) | Cod sursa (job #65567) | Cod sursa (job #1239768) | Cod sursa (job #467117)
Cod sursa(job #467117)
#include <stdio.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];
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++)
B[i+1][i]=1;
B[1][k]=1; B[k][k]=1;
}
void copiaza(int A[LMAX][LMAX],int B[LMAX][LMAX])
{
int i,j;
for (i=1; i<=k; i++)
for (j=1; j<=k; j++)
A[i][j]=B[i][j];
}
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;
}
}
copiaza(A,C);
}
void lgput(int exp)
{
int i,j,part[LMAX][LMAX];
for (i=1; i<=k; i++)
{
for (j=1; j<=k; j++)
rez[i][j]=0;
rez[i][i]=1;
}
copiaza(part,B);
while (exp)
{
if (exp & 1)
mul(rez,part);
mul(part,part);
exp>>=1;
}
}
void solve()
{
int i;
for (i=poz+1; i<=3; i++)
{
lgput(A[i]-act);
mul(pos,rez);
pos[1][k]=0;
act=A[i];
}
lgput(n-A[m]);
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;
}