Pagini recente » Cod sursa (job #362538) | Cod sursa (job #557288) | Cod sursa (job #1536265) | Cod sursa (job #481881) | Cod sursa (job #1517505)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxK 21
#define mod 9901
#define maxM 1002
using namespace std;
int n, m, k, sol[maxK][maxK], v[maxM], mat[maxK][maxK], res[maxK][maxK];
void mul(int a[maxK][maxK], int b[maxK][maxK])
{
int k, i, j;
for (i = 0; i < maxK; ++ i)
for (j = 0; j < maxK; ++ j)
{
res[i][j] = 0;
for (k = 0; k < maxK; ++ k)
res[i][j] = (res[i][j] + 1LL * a[i][k] * b[k][j]);
}
for (i = 0; i < maxK; ++ i)
for (j = 0; j < maxK; ++ j)
a[i][j] = res[i][j] % mod;
}
void read()
{
int i;
freopen("pod.in", "r", stdin);
scanf("%d %d %d", &n, &m, &k);
for (i = 1; i <= m; ++ i)
scanf("%d", &v[i]);
sort(v + 1, v + m + 1);
v[++ m] = n;
sol[1][k] = 1;
}
void lpow(int x)
{
int i, j;
memset(mat, 0, sizeof(mat));
for (i = 1; i <= k; ++ i)
mat[i][i - 1] = 1;
mat[1][k] = mat[k][k] = 1;
for (i = 0; (1 << i) <= x; ++ i)
{
if (x & (1 << i))
mul(sol, mat);
mul(mat, mat);
}
}
void solve()
{
int i;
for (i = 1; i <= m; ++ i)
{
lpow(v[i] - v[i - 1]);
if (i < m)
sol[1][k] = 0;
}
}
void write()
{
freopen("pod.out", "w", stdout);
printf("%d", sol[1][k]);
}
int main()
{
read();
solve();
write();
return 0;
}