Cod sursa(job #468068)

Utilizator DraStiKDragos Oprica DraStiK Data 2 iulie 2010 09:33:57
Problema Pod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <algorithm>
using namespace std;

#define MOD 9901
#define MAX 1005
#define DIM 25

int a[DIM][DIM],b[DIM][DIM],m1[DIM][DIM],m2[DIM][DIM];
int v[MAX];
int n,m,k;

void read ()
{
    int i;

    scanf ("%d%d%d",&n,&m,&k);
    for (i=1; i<=m; ++i)
        scanf ("%d",&v[i]);
}

inline void init (int a[DIM][DIM])
{
    int i,j;

    for (i=1; i<=k; ++i)
        for (j=1; j<=k; ++j)
            if (i==j)
                a[i][j]=1;
            else
                a[i][j]=0;
}

inline void copy (int a[DIM][DIM],int b[DIM][DIM])
{
    int i,j;

    for (i=1; i<=k; ++i)
        for (j=1; j<=k; ++j)
            a[i][j]=b[i][j];
}

inline void mult (int a[DIM][DIM],int b[DIM][DIM],int n,int m,int q)
{
    int c[DIM][DIM];
    int i,j,k;

    for (i=1; i<=n; ++i)
        for (j=1; j<=q; ++j)
        {
            c[i][j]=0;
            for (k=1; k<=m; ++k)
                c[i][j]+=a[i][k]*b[k][j];
        }
    for (i=1; i<=n; ++i)
        for (j=1; j<=q; ++j)
            a[i][j]=c[i][j]%MOD;
}

void solve ()
{
    int i,p;

    sort (v+1,v+m+1);
    b[1][1]=a[1][1]=a[k][1]=1;
    for (i=2; i<=k; ++i)
        a[i-1][i]=1;
    for (i=1; i<=m; ++i)
    {
        init (m1);
        copy (m2,a);
        for (p=v[i]-v[i-1]; p ;p>>=1)
        {
            if (p&1)
                mult (m1,m2,k,k,k);
            mult (m2,m2,k,k,k);
        }
        mult (b,m1,1,k,k);
        b[1][1]=0;
    }
    init (m1);
    copy (m2,a);
    for (p=n-v[m]; p ;p>>=1)
    {
        if (p&1)
            mult (m1,m2,k,k,k);
        mult (m2,m2,k,k,k);
    }
    mult (b,m1,1,k,k);
    printf ("%d",b[1][1]);
}

int main ()
{
    freopen ("pod.in","r",stdin);
    freopen ("pod.out","w",stdout);

    read ();
    solve ();

    return 0;
}