Cod sursa(job #2486119)

Utilizator DysKodeTurturica Razvan DysKode Data 2 noiembrie 2019 12:28:54
Problema Pod Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 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 puteri[100];

matrix matPow(matrix m, int put){
    matrix ans = I;
    for(int i = 0 ; (1<<i) <= put ; i++){
        if( (1<<i) & put ){
            ans = ans * puteri[i];
        }
    }
    return ans;
}

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;
    puteri[0] = c;
    for(int i = 1 ; i <= 50 ; i++){
        puteri[i] = puteri[i-1] * puteri[i-1];
    }

    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];

}