Pagini recente » Cod sursa (job #1268517) | Cod sursa (job #3214095) | Cod sursa (job #2642258) | Statistici Keller Victor (KennyTVK) | Cod sursa (job #2372176)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin ("pod.in");
ofstream cout ("pod.out");
int n, m, k, ans;
int p[1005];
int sol[21][21], tmp[21][21], a[21][21], dp1[21], dp2[21];
void init1(int a[][21]) {
for(int i = 1; i <= k; i++) {
for(int j = 1; j <= k; j++)
a[i][j] = 0;
}
}
void init2(int a[][21], int b[][21]) {
for(int i = 1; i <= k; i++) {
for(int j = 1; j <= k; j++)
a[i][j] = b[i][j] % 9901;
}
}
void mult(int a[][21], int b[][21]) {
init1(tmp);
for(int i = 1; i <= k; i++) {
for(int j = 1; j <= k; j++) {
for(int l = 1; l <= k; l++)
tmp[i][j] += a[i][l] * b[l][j];
}
}
init2(a, tmp);
}
void put(int n) {
for(int i = 0; (1 << i) <= n; i++) {
if((1 << i) & n)
mult(sol, a);
mult(a, a);
}
}
int main() {
cin >> n >> m >> k;
for(int i = 1; i <= m; i++)
cin >> p[i];
p[m + 1] = n;
sort(p + 1, p + m + 1);
dp2[k] = 1;
for(int i = 1; i <= m + 1; i++) {
for(int j = 1; j <= k; j++) {
for(int l = 1; l <= k; l++) {
sol[j][l] = (j == l);
if(l == k)
a[j][l] = (j == 1 || j == k);
else
a[j][l] = (j == l + 1);
dp1[j] = 0;
}
}
put(p[i] - p[i - 1]);
for(int j = 1; j <= k; j++) {
for(int l = 1; l <= k; l++)
dp1[j] += dp2[l] * sol[l][j];
}
for(int j = 1; j <= k; j++)
dp2[j] = dp1[j] % 9901;
if(i != m + 1)
dp2[k] = 0;
}
cout << dp2[k];
return 0;
}