Pagini recente » Cod sursa (job #934433) | Cod sursa (job #4865) | Cod sursa (job #2009168) | Arhiva de probleme | Cod sursa (job #919932)
Cod sursa(job #919932)
#include <cstdio>
#include <algorithm>
#define MAX_K 22
#define MAX_M 1010
#define MOD 9901
using namespace std;
int n, m, k, ans[MAX_K][MAX_K], a[MAX_K][MAX_K], v[MAX_M];
void inmultire (int a[MAX_K][MAX_K], int b[MAX_K][MAX_K]){
int i, j, y, c[MAX_K][MAX_K];
for (i = 1; i <= k; i++)
for (j = 1; j <= k; j++) c[i][j] = 0;
for (i = 1; i <= k; i++)
for (j = 1; j <= k; j++)
for (y = 1; y <= k; y++)
c[i][j] = (c[i][j] + a[i][y] * b[y][j]) % MOD;
for (i = 1; i <= k; i++)
for (j = 1; j <= k; j++) a[i][j] = c[i][j];
}
void pow (int p) {
for (int i = 1; i <= k; i++)
for (int j = 1; j <= k; j++) a[i][j] = 0;
for (int i = 1; i <= k; i++) {
a[i][k] = 1;
a[i + 1][i] = 1;
}
for (int i = 0; (1 << i) <= p; i++) {
if (p & (1 << i)) inmultire (ans, a);
inmultire (a, a);
}
}
int main()
{
freopen ("pod.in","r",stdin);
freopen ("pod.out","w",stdout);
scanf ("%d %d %d", &n, &m, &k);
int i;
for (i = 1; i <= m; i++) scanf ("%d ", &v[i]);
sort (v + 1, v + m + 1);
ans[1][k] = 1;
v[++m] = n;
for (i = 1; i <= m; i++) {
pow (v[i] - v[i - 1]);
if (i < m) ans[1][k] = 0;
}
printf ("%d\n", ans[1][k]);
return 0;
}