Cod sursa(job #2356915)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 26 februarie 2019 23:32:03
Problema Pod Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 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;
const int LOGMAX = 30;
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;
}

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;

    vector<vector<vector<int>>> powers(1 + LOGMAX, vector<vector<int>> (k + 1, vector<int> (k + 1, 0)));
    for(int i = 1; i <= k; i ++)
        for(int j = 1; j <= k; j ++)
            powers[0][i][j] = base[i][j];
    for(int step = 1; step <= LOGMAX; step ++) {
        multiply(powers[step - 1], powers[step - 1], k, k, k);
        for(int i = 1; i <= k; i ++)
            for(int j = 1; j <= k; j ++)
                powers[step][i][j] = mat[i][j];
    }

    for(auto it : events) {

        int dif = it - last;
        last = it;
        for(int step = LOGMAX; step >= 0; step --) {
            if(dif & (1 << step)) {
                multiply(powers[step], dp, k, k, 1);
                for(int i = 1; i <= k; i ++)
                    dp[i][1] = mat[i][1];
            }
        }

        if(it < n)
            dp[k][1] = 0;
    }

    if(events[events.size() - 2] == n)
        out << 0;
    else
        out << dp[k][1];

    return 0;
}