Pagini recente » Cod sursa (job #1727091) | Cod sursa (job #2837663) | Cod sursa (job #2142837) | Cod sursa (job #2235082) | Cod sursa (job #467192)
Cod sursa(job #467192)
#include<cstdio>
#include<algorithm>
using namespace std;
const int KMAX=21;
const int MOD=9901;
int k,n,m,l[1005];
void copy(int a[KMAX][KMAX],int b[KMAX][KMAX])
{
for(int i=0;i<KMAX;i++)
for(int j=0;j<KMAX;j++)
a[i][j]=b[i][j];
}
void del(int a[KMAX][KMAX])
{
for(int i=0;i<KMAX;i++)
for(int j=0;j<KMAX;j++)
a[i][j]=0;
}
void inm(int rez[KMAX][KMAX],int a[KMAX][KMAX],int b[KMAX][KMAX])
{
int aux[KMAX][KMAX];
del(aux);
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
for(int l=1;l<=k;l++)
{
aux[i][l]+=a[i][j]*b[j][l];
aux[i][l]%=MOD;
}
copy(rez,aux);
}
void makeidentic(int a[KMAX][KMAX])
{
for(int i=1;i<=k;i++)
a[i][i]=1;
}
void makerec(int a[KMAX][KMAX])
{
for(int i=1;i<k;i++)
a[i][i+1]=1;
a[k][1]=a[k][k]=1;
}
bool verif(int k)
{
for(int i=1;i<=m;i++)
if(l[i]==k)
return true;
return false;
}
void solve()
{
if(l[1]==1 && verif(k))
{
printf("0");
return;
}
int lastpos=0,put=0,rez=1;
int a[KMAX][KMAX],c[KMAX][KMAX];
for(int i=1;i<=m;i++)
{
put=l[i]-lastpos-1;
del(a);
del(c);
makeidentic(a);
makerec(c);
if(put>0)
{
while(put)
{
if(put&1)
inm(a,a,c);
inm(c,c,c);
put>>=1;
}
lastpos=l[i]+k-1;
rez*=a[k][k];
rez%=MOD;
}
}
if(l[m]==n)
{
printf("0");
return;
}
put=n-lastpos;
del(a);
del(c);
makeidentic(a);
makerec(c);
while(put)
{
if(put&1)
inm(a,a,c);
inm(c,c,c);
put>>=1;
}
rez*=a[k][k];
rez%=MOD;
printf("%d",rez);
}
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",&l[i]);
sort(l+1,l+m+1);
solve();
return 0;
}