Cod sursa(job #2240373)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 13 septembrie 2018 10:23:28
Problema Pod Scor 5
Compilator cpp Status done
Runda simulare_prega Marime 1.74 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("pod.in"); ofstream fout ("pod.out");

typedef long long i64;
const int kmax = 20;
const int mod = 9901;

int p;

struct Matrice {
    int v[kmax][kmax];

    void init () {
        memset(v, 0, sizeof(v));
        for (int i = 0; i < p; ++ i) {
            v[i][i] = 1;
        }
    }

    Matrice operator * (const Matrice &shp) const {
        Matrice ans;
        memset(ans.v, 0, sizeof(ans.v));

        for (int i = 0; i < p; ++ i) {
            for (int k = 0; k < p; ++ k) {
                for (int j = 0; j < p; ++ j) {
                    ans.v[i][j] += v[i][k] * shp.v[k][j];
                }
            }
        }

        for (int i = 0; i < p; ++ i)
            for (int j = 0; j < p; ++ j)
                ans.v[i][j] %= mod;
        return ans;
    }

    Matrice operator ^ (int n) {
        Matrice b = *this;
        Matrice ans; ans.init();

        while (n) {
            if (n & 1) {
                ans = ans * b;
            }
            n >>= 1;
            b = b * b;
        }
        return ans;
    }
} st, tr;

int main () {
    int n, m;
    fin >> n >> m >> p;

    vector<int> lipsa(m);
    for (int i = 0; i < m; ++ i) {
        fin >> lipsa[i];
    }
    sort(lipsa.begin(), lipsa.end());

    for (int i = 0; i < p; ++ i)
        tr.v[i][0] = 1;
    for (int i = 0; i + 1 < p; ++ i)
        tr.v[i][i + 1] = 1;

    st.v[0][0] = 1;
    int lst = 0;
    for (auto i : lipsa) {
        st = st * (tr ^ (i - 1 - lst));
        lst = i;

        for (int j = 1; j < p; ++ j)
            st.v[0][j] = st.v[0][j - 1];
        st.v[0][0] = 0;
    }

    st = st * (tr ^ (n - lst));
    lst = n;
    fout << st.v[0][0] << "\n";

    fin.close();
    fout.close();
    return 0;
}