Pagini recente » Cod sursa (job #297548) | Cod sursa (job #1700169) | Cod sursa (job #1612348) | Cod sursa (job #1380293) | Cod sursa (job #2244159)
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream cin ("pod.in");
ofstream cout ("pod.out");
const int MMAX = 1e3;
const int NMAX = 1e6;
const int MOD = 9901;
int n, m, k;
int v[2 + MMAX];
int a[21][21], b[21][21], sol[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] + 1LL * a[i][l] * b[l][j]) % MOD;
}
}
memcpy(a, c, sizeof(c));
}
void print(int v[][21]) {
for(int i = 1; i <= k; i++) {
for(int j = 1; j <= k; j++)
cout << v[i][j] << " ";
cout << "\n";
}
}
void lgput(int a[][21], int p) {
int sol[21][21], tmp[21][21];
memset(sol, 0, sizeof(sol)); memset(a, 0, sizeof(tmp));
for(int i = 1; i <= k; i++)
a[i][i] = 1;
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(a, sol);
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] = 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, a);
memcpy(sol, b, sizeof(sol));
memset(b, 0, sizeof(b));
for(int j = 1; j < k; j++)
b[j][j + 1] = 1;
}
cout << sol[k - 1][k];
return 0;
}