Cod sursa(job #1019829)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 31 octombrie 2013 23:09:06
Problema Pod Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <fstream>
#include <cstring>
#include <algorithm>

#define mod 9901

using namespace std;

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

int gap[1001],k,n,m,current;
int a[21],gap_u[21][21],u[21][21],standard_u[21][21];

void intialize_units ()
{
    for (int i=0; i<k; ++i)
    {
        u[i][i] = 1;
    }

    for (int i=1; i<k; ++i)
    {
        gap_u[i-1][i] = 1;
    }

    for (int i=0; i<k; ++i)
        standard_u[i][0] = 1;

    for (int i=1; i<k; ++i)
    {
        standard_u[i-1][i] = 1;
    }
}

void matrix_power (int m[][21], int p)
{
    if (p==0)
    {
        memcpy (m,u,sizeof(u));
        return;
    }

    int send[21][21],temp[21][21];
    memset (temp,0,sizeof(temp));
    memset (send,0,sizeof(send));

    matrix_power (send, p/2);

    for (int i=0; i<k; ++i)
    for (int j=0; j<k; ++j)
    for (int h=0; h<k; ++h)
    {
        temp[i][j] += (send[i][h]*send[h][j])%mod;
        if (temp[i][j] >= mod) temp[i][j] -= mod;
    }

    if (p%2)
    {
        for (int i=0; i<k; ++i)
        for (int j=0; j<k; ++j)
        for (int h=0; h<k; ++h)
        {
            m[i][j] += (temp[i][h]*standard_u[h][j])%mod;
            if (m[i][j] >= mod) m[i][j] -= mod;
        }
    }
    else
    {
        memcpy (m,temp,sizeof(temp));
    }
}

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

    for (int i=1; i<=m; ++i)
        fin>>gap[i];

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

    intialize_units ();

    a[0] = 1;
    current = 1;

    gap[m+1] = n+1;

    for (int i=1; i<=m+1; ++i)
    {
        int dist = gap[i] - current - 1;

        int ma[21][21],temp[21];
        memset (ma,0,sizeof(ma));
        memset (temp,0,sizeof(temp));

        matrix_power (ma,dist);

        for (int i=0; i<k; ++i)
        {
            for (int j=0; j<k; ++j)
            {
                temp[i] += (a[j]*ma[j][i])%mod;
                if (temp[i] >= mod) temp[i] -= mod;
            }
        }

        memset (a,0,sizeof(a));

        for (int i=0; i<k ; ++i)
        {
            for (int j=0; j<k; ++j)
            {
                a[i] += (temp[j]*gap_u[j][i])%mod;
                if (a[i] >= mod) a[i] -= mod;
            }
        }

        current = gap[i];
    }

    fout<<a[1];
}