Pagini recente » Cod sursa (job #1610380) | Cod sursa (job #942769) | Cod sursa (job #2751868) | Cod sursa (job #847174) | Cod sursa (job #1838098)
#include <cstdio>
#include <algorithm>
#include <iostream>
#define mod 9901
using namespace std;
int n,m,k;
int lipsa[1010];
int sol[23][23],red[23][23],sup[23][23];
inline void nulify(int a[23][23])
{
int i,j;
for(i=1;i<=22;i++)
for(j=1;j<=22;j++) a[i][j]=0;
}
inline void setsup()
{
nulify(sup);
for(int i=1;i<k;i++)
sup[i+1][i]=1;
sup[1][k]=1;
sup[k][k]=1;
}
inline void copi( int a[23][23],int b[23][23])
{
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
a[i][j]=b[i][j];
}
inline void inmult(int a[23][23],int b[23][23])
{
int aux[23][23];
nulify(aux);
int s,l;
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
{
s=0;
for(l=1;l<=k;l++) s+=a[i][l]*b[l][j];
aux[i][j]=s%mod;
}
copi(a, aux);
}
inline void upsup(int p)
{
int i,i2,j,aux[23][23];
nulify(aux);
for(i=1;i<=k;i++) aux[i][i]=1;
for(i=1;i<=p;i<<=1)
{
if( i&p ) inmult(aux,sup);
inmult(sup,sup);
}
inmult(sol,aux);
}
int main()
{
int i;
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);
lipsa[++m]=n+1;
for(i=1;i<k;i++) red[i+1][i]=1;
for(i=1;i<=k;i++) sol[i][i]=1;
for(i=1;i<=m;i++)
{
setsup();
upsup(lipsa[i]-lipsa[i-1]-1);
if(i<m) inmult(sol,red);
}
printf("%d\n",sol[k][k]);
fclose(stdin);
fclose(stdout);
return 0;
}