Pagini recente » Cod sursa (job #83687) | Cod sursa (job #1624891) | Cod sursa (job #1827866) | Cod sursa (job #1449898) | Cod sursa (job #2244180)
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream cin ("pod.in");
ofstream cout ("pod.out");
const int MMAX = 1e3;
const int MOD = 9901;
int n, m, k;
int v[2 + MMAX];
int a[21][21], b[21][21], sol[21][21], tmp[21][21];
void mult(int a[][21], int b[][21]) {
int c[21][21];
memset(c, 0, sizeof(c));
for(int i = 1; i <= k; i++) {
for(int j = 1; j <= k; j++) {
for(int l = 1; l <= k; l++)
c[i][j] = (c[i][j] + a[i][l] * b[l][j]) % MOD;
}
}
memcpy(b, c, sizeof(c));
}
void lgput(int a[][21], int p) {
int sol[21][21];
memset(sol, 0, sizeof(sol));
for(int i = 1; i <= k; i++) {
for(int j = 1; j <= k; j++)
a[i][j] = (i == j);
}
for(int i = 1; i < k; i++)
sol[i][i + 1] = 1;
sol[k][1] = sol[k][k] = 1;
for(int i = 0; (1 << i) <= p; i++) {
if((1 << i) & p)
mult(sol, a);
mult(sol, sol);
}
}
int main() {
cin >> n >> m >> k;
for(int i = 1; i <= m; i++)
cin >> v[i];
v[m + 1] = n + 1;
sort(v + 1, v + m + 1);
for(int i = 1; i < k; i++)
b[i][i + 1] = tmp[i][i + 1] = 1;
for(int i = 1; i <= k; i++)
sol[i][i] = 1;
for(int i = 1; i <= m + 1; i++) {
lgput(a, v[i] - v[i - 1] - 1);
mult(a, sol);
mult(b, sol);
}
cout << sol[k - 1][k];
return 0;
}