Pagini recente » Cod sursa (job #3195639) | Cod sursa (job #1594980) | Cod sursa (job #2466146) | Cod sursa (job #667306) | Cod sursa (job #2244032)
#include <algorithm>
#include <memory.h>
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("pod.in");
ofstream out("pod.out");
const int MOD = 9901;
const int NMAX = 1e2;
int n, m, k;
int v[1 + NMAX];
struct matrix {
int v[21][21];
matrix(int x = 0) {
memset(v, 0, sizeof(v));
for(int i = 1; i <= k; i++)
v[i][i] = x;
}
matrix operator*(matrix &x) {
matrix res;
for(int i = 1; i <= k; i++) {
for(int j = 1; j <= k; j++) {
for(int l = 1; l <= k; l++)
res.v[i][j] += v[i][l] * x.v[l][j];
res.v[i][j] %= MOD;
}
}
return res;
}
matrix operator^(int p) {
matrix res(1), aux = (*this);
while(p) {
if(p & 1)
res = res * aux;
p >>= 1;
aux = aux * aux;
}
return res;
}
} a, b;
int main()
{
in >> n >> m >> k;
for(int i = 1; i <= m; i++)
in >> v[i];
sort(v + 1, v + m + 1);
v[m + 1] = n + 1;
for(int i = 1; i < k; i++) {
a.v[i][i + 1] = 1;
b.v[i][i + 1] = 1;
}
a.v[k][1] = 1;
a.v[k][k] = 1;
matrix res(1);
for(int i = 1; i <= m + 1; i++) {
res = (a ^ (v[i] - 1 - v[i - 1])) * res;
res = b * res;
}
out << res.v[k - 1][k] << '\n';
in.close();
out.close();
return 0;
}