Pagini recente » Cod sursa (job #2969097) | Cod sursa (job #534064) | Cod sursa (job #1174546) | Cod sursa (job #2008657) | Cod sursa (job #1482238)
#include<stdio.h>
#include<algorithm>
#define maxn 25
#define maxm 1005
#define MOD 9901
using namespace std;
int n,m,K;
int add[maxn][maxn],b[maxn][maxn];
int sol[maxn][maxn],dp[maxn];
int gap[maxm];
void read()
{
scanf("%d %d %d",&n,&m,&K);
for(int i=1;i<=m;i++) scanf("%d",&gap[i]);
}
inline void mult(int a[maxn][maxn],int b[maxn][maxn])
{
int aux[maxn][maxn];
for(int i=1;i<=K;i++)
for(int j=1;j<=K;j++)
{
aux[i][j]=0;
for(int k=1;k<=K;k++){
aux[i][j]+=(a[i][k]*b[k][j])%MOD;
if(aux[i][j]>=MOD) aux[i][j]-=MOD;
}
}
for(int i=1;i<=K;i++)
for(int j=1;j<=K;j++)
a[i][j]=aux[i][j];
}
inline void mat_pow(int p)
{
for(int i=1;i<K;i++)
{
for(int j=1;j<=K;j++) add[j][i]=0;
add[i+1][i]=1;
}
for(int i=1;i<=K;i++) add[i][K]=0;
add[1][K]=add[K][K]=1;
for(int i=0;p>>i;i++)
{
if(((p>>i)&1)) mult(sol,add);
mult(add,add);
}
}
void solve()
{
sort(gap+1,gap+m+1);
gap[++m]=n+1;
for(int i=1;i<=K;i++)
for(int j=1;j<=K;j++)
if(i==j) sol[i][j]=1;
for(int i=1;i<K;i++) b[i+1][i]=1;
for(int i=1;i<=m;i++)
{
mat_pow(gap[i]-gap[i-1]-1);
if(i<m) mult(sol,b);
}
printf("%d",sol[K][K]);
}
int main()
{
freopen("pod.in","r",stdin);
freopen("pod.out","w",stdout);
read();
solve();
fclose(stdin);
fclose(stdout);
return 0;
}