Cod sursa(job #2595723)

Utilizator betybety bety bety Data 8 aprilie 2020 12:11:07
Problema Pod Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <bits/stdc++.h>



using namespace std;



ifstream f("pod.in");

ofstream g("pod.out");



const int mod = 9901;



const int MMAX = 1005;

void dfff(int node,bool sgn,bool fr)

{

    bool ok[1005];

    for(int i=1;i<=node;++i)

    for(int j=node+1;j<=2*node;++j)

    if(ok[i]==ok[j])

    {

        ok[i]=sgn;

        dfff(i,1-sgn,fr);

        ok[j]=fr;

        dfff(j,sgn,1-fr);

    }

    return;

}


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;

}