Cod sursa(job #1019852)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 31 octombrie 2013 23:45:36
Problema Pod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 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],standard_u[21][21];

void intialize_units ()
{
    standard_u[0][0] = 1;
    standard_u[k-1][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==1)
    {
        memcpy (m,standard_u,sizeof(standard_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];
    }
    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];
        }
        temp[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 = 0;

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

        if (dist!=0)
        {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;
            }
        }
            memcpy (a,temp,sizeof(a));
        }

        for (int i=k-1; i>=1; --i)
        {
            a[i] = a[i-1];
        }
        a[0]=0;

        current = gap[i];
    }

    fout<<a[1];
}