Cod sursa(job #2354836)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 25 februarie 2019 17:02:22
Problema Pod Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <utility>
#include <cstring>

using namespace std;

const int MOD = 9901;
const int KMAX = 25;
int mat[KMAX][KMAX];

void multiply(const vector<vector<int>> &x, const vector<vector<int>> &y, int n, int m, int p) {
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= p; j ++)
            mat[i][j] = 0;

    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= p; j ++)
            for(int k = 1; k <= m; k ++)
                mat[i][j] = (mat[i][j] + x[i][k] * y[k][j]) % MOD;
}

void lgput(vector<vector<int>> &ans, const vector<vector<int>> &x, int p, int k) {
    vector<vector<int>> base(k + 1, vector<int> (k + 1, 0));
    for(int i = 1; i <= k; i ++)
        for(int j = 1; j <= k; j ++)
            base[i][j] = x[i][j];

    while(p) {
        if(p % 2) {
            multiply(ans, base, k, k, k);
            for(int i = 1; i <= k; i ++)
                for(int j = 1; j <= k; j ++)
                    ans[i][j] = mat[i][j];
        }

        multiply(base, base, k, k, k);
        for(int i = 1; i <= k; i ++)
            for(int j = 1; j <= k; j ++)
                base[i][j] = mat[i][j];

        p /= 2;
    }
}

int main() {
    ifstream in("pod.in");
    ofstream out("pod.out");

    int n, m, k;
    in >> n >> m >> k;
    vector<int> events(m, 0);
    for(int i = 0; i < m; i ++)
        in >> events[i];
    sort(events.begin(), events.end());
    events.push_back(n);

    vector<vector<int>> dp(k + 1, vector<int> (2, 0));
    int last = 0;
    dp[k][1] = 1;

    vector<vector<int>> base(k + 1, vector<int> (k + 1, 0));
    for(int i = 1; i < k; i ++)
        base[i][i + 1] = 1;
    base[k][1] = base[k][k] = 1;

    for(auto it : events) {

        int dif = it - last;
        last = it;
        vector<vector<int>> ans(k + 1, vector<int> (k + 1, 0));
        for(int i = 1; i <= k; i ++)
            ans[i][i] = 1;
        lgput(ans, base, dif, k);
        multiply(ans, dp, k, k, 1);

        for(int i = 1; i <= k; i ++)
            dp[i][1] = mat[i][1];
        if(it < n)
            dp[k][1] = 0;
    }
    out << dp[k][1];

    return 0;
}


/// daca scandura n e lipsa?