Cod sursa(job #2491451)

Utilizator bluestorm57Vasile T bluestorm57 Data 12 noiembrie 2019 17:08:42
Problema Pod Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("pod.in");
ofstream g("pod.out");

const int mod = 9901;

const int MMAX = 1005;

int n,m,k;

int v[MMAX];

struct matrix{
    int mat[21][21];

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

    matrix operator*(matrix b){
        matrix c;
        for(int o = 0 ; o < k ; o++)
            for(int i = 0 ; i < k ; i++)
                for(int j = 0 ; j < k ; j++)
                    c.mat[i][j] = (c.mat[i][j] + mat[i][o] * b.mat[o][j]) % mod;

        return c;
    }
};

matrix Initial, C, P[105];
matrix a,b,c;

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

int main(){
    int i,j;
    f >> n >> m >> k;

    for(i = 0 ; i < k ; i++)
        Initial.mat[i][i] = 1;

    for(i = 0 ; i < k - 1 ; i++)
        C.mat[i + 1][i] = 1;
    C.mat[0][k - 1] = 1;
    C.mat[k - 1][k - 1] = 1;

    P[0] = C;
    for(i = 1 ; i <= 50 ; i++)
        P[i] = P[i - 1] * P[i - 1];

    for(i = 1 ; i <= m ; i++)
        f >> v[i];

    sort(v + 1, v + m + 1);

    v[++m] = n + 1;

    a.mat[0][k - 1] = 1;

    for(i = 1 ; i <= m ; i++){
        b = c;
        b = matPow(b, v[i] - v[i - 1]);
        a = a * b;
        a.mat[0][k - 1] = 0;
    }

    g << a.mat[0][k - 2];

    return 0;
}