Pagini recente » Cod sursa (job #2400871) | Istoria paginii utilizator/cezarlupu | Cod sursa (job #1143341) | Cod sursa (job #1556873) | Cod sursa (job #2244038)
#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 DIM = 21;
const int NMAX = 1e3;
int n, m;
int k;
int v[1 + NMAX];
struct matrix {
int v[DIM][DIM];
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 j1 = 1; j1 <= k; j1++) {
for(int j2 = 1; j2 <= k; j2++) {
res.v[i][j1] += v[i][j2] * x.v[j2][j1];
}
res.v[i][j1] %= 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;
}
};
matrix a;
matrix 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;
}