Cod sursa(job #919932)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 19 martie 2013 22:13:01
Problema Pod Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#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;
}