Pagini recente » Cod sursa (job #2853717) | Cod sursa (job #2566974) | Cod sursa (job #2765187) | Cod sursa (job #1922347) | Cod sursa (job #2639873)
#include<bits/stdc++.h>
using namespace std;
const int MOD=9901;
const int NMAX=25;
int n,m,k,ans;
int p[1005];
int sol[NMAX][NMAX],tmp[NMAX][NMAX],a[NMAX][NMAX];
int dp1[NMAX],dp2[NMAX];
void init1(int a[][NMAX]){
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
a[i][j]=0;
}
void init2(int a[][NMAX], int b[][NMAX]){
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
a[i][j]=b[i][j]%MOD;
}
void mult(int a[][NMAX], int b[][NMAX]){
init1(tmp);
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
for(int l=1;l<=k;l++)
tmp[i][j]+=a[i][l]*b[l][j];
init2(a, tmp);
}
void put(int n){
for(int i=0;(1<<i)<=n;i++){
if((1<<i) & n)
mult(sol, a);
mult(a, a);
}
}
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", &p[i]);
p[m+1]=n;
sort(p+1, p+m+1);
dp2[k]=1;
for(int i=1;i<=m+1;i++){
for(int j=1;j<=k;j++){
for(int l=1;l<=k;l++){
sol[j][l]=(j==l);
if(l==k)
a[j][l]=(j==1 || j==k);
else
a[j][l]=(j==l+1);
dp1[j]=0;
}
}
put(p[i]-p[i-1]);
for(int j=1;j<=k;j++)
for(int l=1;l<=k;l++)
dp1[j]+=dp2[l]*sol[l][j];
for(int j=1;j<=k;j++)
dp2[j]=dp1[j]%MOD;
if(i!=m+1)
dp2[k]=0;
}
printf("%d", dp2[k]);
return 0;
}