Cod sursa(job #1513393)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 29 octombrie 2015 14:16:01
Problema Pod Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#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;
}