Cod sursa(job #2485458)

Utilizator StanCatalinStanCatalin StanCatalin Data 1 noiembrie 2019 16:51:35
Problema Pod Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

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

const int MOD = 9901;

int n,m,k,v[1005],dp[25],st;

struct matrix
{
    long long int m[23][23];
    matrix()
    {
        for (int i=0; i<23; i++)
        {
            for (int j=0; j<23; j++)
            {
                m[i][j] = 0;
            }
        }
    }
    matrix operator*(matrix b)
    {
        matrix c;

        for (int i=0; i<23; i++)
        {
            for (int j=0; j<23; j++)
            {
                for (int k=0; k<23; k++)
                {
                    c.m[i][j] = (c.m[i][j] + m[i][k]*b.m[k][j])%MOD;
                }
            }
        }
        return c;
    }
};

matrix I, start, initial;

matrix putere(int p)
{
    if (p == 0)
        return I;
    if (p == 1)
        return initial;
    matrix aux = putere(p/2);
    aux = aux * aux;
    if (p%2 == 1)
    {
        aux = aux * initial;
    }
    return aux;
}

int main()
{
    in >> n >> m >> k;
    int rasp_fin;
    for (int i=1; i<=m; i++)
    {
        in >> v[i];
    }

    v[m+1] = n;
    int start1 = 1,moment = 1;
    st = 0;
    for (int i=1; i<=m+1; i++)
    {
        if (v[i] - start1 <= k+1)
        {
            memset(dp,0,sizeof(dp));
            ///if (i == 3) cout << moment;
            dp[0] = moment;
            dp[1] = 0;
            for (int j=start1+1; j<v[i]; j++)
            {
                if (j < k)
                {
                    dp[j-start1] = 1;
                }
                else
                {
                    dp[j-start1+1] = dp[j-start1] + dp[j-k-start1+1];
                }
            }
            st = dp[v[i] -start1];
            start1 = v[i];
        }
        else
        {

            for (int j=0; j<=k; j++)
            {
                I.m[j][j] = 1;
            }
            start.m[0][0] = 0;
            start.m[0][1] = st;
            for (int j=2; j<=k; j++)
            {
                start.m[0][j] = start.m[0][j-1];
            }


            for (int j=1; j<=k; j++)
            {
                initial.m[j][j-1] = 1;
            }
            initial.m[1][k] = 1;
            initial.m[k][k] = 1;

            if (i <= m)
            {
                matrix rasp = putere(v[i]-start1-2);
                rasp = start * rasp;
                moment = rasp.m[0][k];
                start1 = v[i];

            }
            else
            {

                matrix rasp = putere(n-start1-2);
                rasp = start * rasp;
                rasp_fin =  rasp.m[0][k];
            }
        }
    }
    out << rasp_fin;
    return 0;
}