Cod sursa(job #2486118)

Utilizator DysKodeTurturica Razvan DysKode Data 2 noiembrie 2019 12:25:09
Problema Pod Scor 75
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("pod.in");
ofstream fout("pod.out");
int v[1010];
int n, m , p;
const int modu = 9901;

struct matrix{
    int m[21][21];
    matrix(){
        for(int i = 0 ; i < 21 ; i++){
            for(int j = 0 ; j < 21 ; j++){
                m[i][j] = 0;
            }
        }
    }

    matrix operator*(matrix b){
        matrix c;
        for(int k = 0 ; k < p ; k++){
            for(int i = 0 ; i < p ; i++){
                for(int j = 0 ; j < p ; j++){
                    c.m[i][j] = (c.m[i][j] + m[i][k]*b.m[k][j]) % modu;
                }
            }
        }
        return c;
    }

    void print(){
        for(int i = 0 ; i < p ; i++){
            for(int j = 0 ; j < p ; j++){
                cout << m[i][j] << ' ';
            }
            cout << '\n';
        }
    }
};

matrix O, I, a, b, c;

matrix matPow(matrix m, int put){
    if( put == 0 ) return I;
    if( put == 1 ) return m;
    matrix aux = matPow(m, put / 2);
    aux = aux * aux;
    if(put % 2 == 1)
        aux = aux * m;
    return aux;
}

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

    for(int i = 0 ; i < p ; i++){
        I.m[i][i] = 1;
    }
    for(int i = 0 ; i < p - 1 ; i++){
        c.m[i+1][i] = 1;
    }
    c.m[0][p-1] = 1;
    c.m[p-1][p-1] = 1;
    c.print();

    for(int i = 1 ; i <= m ; i++){
        fin >> v[i];
    }
    sort(v + 1 , v + m + 1);
    m++;
    a.m[0][p-1] = 1;
    v[m] = n + 1;
    for(int i = 1 ; i <= m ; i++){
        b = c;
        b = matPow(b, v[i]-v[i-1]);
        a = a * b;
        a.m[0][p-1] = 0;
    }
    fout << a.m[0][p-2];

}