Pagini recente » Cod sursa (job #834310) | Cod sursa (job #1733398) | Cod sursa (job #2112667) | Cod sursa (job #1646164) | Cod sursa (job #1513394)
#include <fstream>
#include <algorithm>
#include <cstring>
#include <cassert>
using namespace std;
const int mod = 9901;
int k;
class matrix {
public:
int mat[21][21];
matrix (int c = 0) {
memset(mat, 0, sizeof(mat));
for (int i = 1; i <= k; ++ i)
mat[i][i] = c;
}
matrix operator* (const matrix &x) const {
matrix res;
int i, j, l;
for (i = 1; i <= k; ++ i)
for (j = 1; j <= k; ++ j)
for (l = 1; l <= k; ++ l)
res.mat[i][j] = (res.mat[i][j] + mat[i][l] * x.mat[l][j]) % mod;
return res;
}
matrix operator^ (int b) const {
matrix res(1);
matrix aux = (*this);
while (b) {
if (b & 1)
res = res * aux;
b >>= 1;
aux = aux * aux;
}
return res;
}
} _free, occupied;
const int MMAX = 1005;
int n, m;
int v[MMAX];
int main()
{
ifstream cin("pod.in");
ofstream cout("pod.out");
cin >> n >> m >> k;
for (int i = 1; i <= m; ++ i)
cin >> v[i];
sort(v + 1, v + m + 1);
v[m + 1] = n + 1;
if (k == 1) {
cout << (!m) << '\n';
assert(0);
cin.close();
cout.close();
return 0;
}
for (int i = 1; i < k; ++ i)
_free.mat[i][i + 1] = occupied.mat[i][i + 1] = 1;
_free.mat[k][1] = _free.mat[k][k] = 1;
matrix res(1);
/* for (int i = 1; i <= m + 1; ++ i) {
res = (_free ^ (v[i] - 1 - v[i - 1])) * res;
res = occupied * res;
}*/
cout << res.mat[k - 1][k] << '\n';
cin.close();
cout.close();
return 0;
}