Cod sursa(job #468066)

Utilizator DraStiKDragos Oprica DraStiK Data 2 iulie 2010 09:30:25
Problema Pod Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 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 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)
    {
        memset (m1,0,sizeof (m1));
        for (i=1; i<=k; ++i)
            m1[i][i]=1;
        memcpy (m2,a,sizeof (m2));
        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;
    }
    memset (m1,0,sizeof (m1));
    for (i=1; i<=k; ++i)
        m1[i][i]=1;
    memcpy (m2,a,sizeof (m2));
    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;
}