Pagini recente » Cod sursa (job #3193591) | Cod sursa (job #2078087) | Cod sursa (job #1268) | Cod sursa (job #116676) | Cod sursa (job #467025)
Cod sursa(job #467025)
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define maxn 1010
#define maxk 21
#define mod 9901
long n, m, i, j, k, l, ind, poz;
long p[maxn], mat[maxk][maxk], o[maxk][maxk], aux[maxk][maxk];
long d[maxn*maxk], dn[maxn*maxk];
void inm(long nr)
{
if(nr==1)
{
for(long i=1; i<=k; i++)
for(long j=1; j<=k; j++)
mat[i][j]=o[i][j];
return;
}
inm(nr/2);
memset(aux, 0, sizeof(aux));
for(long l=1; l<=k; l++)
for(long i=1; i<=k; i++)
for(long j=1; j<=k; j++)
aux[i][j]=(aux[i][j]+mat[i][l]*mat[l][j])%mod;
for(long i=1; i<=k; i++)
for(long j=1; j<=k; j++)
mat[i][j]=aux[i][j];
if(nr%2)
{
memset(aux, 0, sizeof(aux));
for(long l=1; l<=k; l++)
for(long i=1; i<=k; i++)
for(long j=1; j<=k; j++)
aux[i][j]=(aux[i][j]+mat[i][l]*o[l][j])%mod;
for(long i=1; i<=k; i++)
for(long j=1; j<=k; j++)
mat[i][j]=aux[i][j];
}
}
int main()
{
freopen("pod.in", "r", stdin);
freopen("pod.out", "w", stdout);
scanf("%d%d%d", &n, &m, &k);
d[0]=1;
for(i=1; i<=m; i++)
scanf("%d", &p[i]);
p[++m]=n;
p[++m]=0;
sort(p+1, p+m+1);
poz=0;
ind=0;
d[k]=1;
for(i=1; i<k; i++)
{
o[i+1][i]=1;
}
o[k][k]=o[1][k]=1;
for(i=2; i<=m; i++)
{
if(p[i]-p[i-1]>k)
{
inm(p[i]-p[i-1]);
for(j=1; j<=k; j++)
{
dn[j]=0;
for(l=1; l<=k; l++)
dn[j]=(dn[j]+d[l]*mat[l][j])%mod;
}
ind=p[i];
for(j=1; j<=k; j++)
d[j]=dn[j];
if(p[i]<n)
d[k]=0;
}
else
{
for(j=k+1; j<=k+p[i]-ind; j++)
if(j!=k+p[i]-ind || p[i]==n)
d[j]=(d[j-k]+d[j-1])%mod;
else
d[j]=0;
for(j=1; j<=k; j++)
d[j]=d[j+p[i]-ind];
ind=p[i];
}
}
printf("%d\n", d[k]);
return 0;
}