Cod sursa(job #467135)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 28 iunie 2010 12:04:06
Problema Pod Scor 15
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 2.13 kb
#include<cstdio>
#include<algorithm>
using namespace std;
const int KMAX=21;
const int MOD=9901;
int k,n,m,l[1005];
void copy(int a[KMAX][KMAX],int b[KMAX][KMAX])
{
    for(int i=0;i<KMAX;i++)
        for(int j=0;j<KMAX;j++)
            a[i][j]=b[i][j];
}
void del(int a[KMAX][KMAX])
{
    for(int i=0;i<KMAX;i++)
        for(int j=0;j<KMAX;j++)
            a[i][j]=0;
}
void inm(int rez[KMAX][KMAX],int a[KMAX][KMAX],int b[KMAX][KMAX])
{
    int aux[KMAX][KMAX];
    del(aux);
    for(int i=1;i<=k;i++)
        for(int j=1;j<=k;j++)
            for(int l=1;l<=k;l++)
            {
                aux[i][l]+=(a[i][j]*b[j][l]);
                aux[i][l]%=MOD;
            }
    copy(rez,aux);
}
void makeidentic(int a[KMAX][KMAX])
{
    for(int i=1;i<=k;i++)
            a[i][i]=1;
}
void makerec(int a[KMAX][KMAX])
{
    for(int i=1;i<k;i++)
        a[i][i+1]=1;
    a[k][1]=a[k][k]=1;
}
void makef(int a[KMAX][KMAX])
{
    a[k][1]=1;
}
bool verif(int k)
{
    for(int i=1;i<=m;i++)
        if(l[i]==k)
            return true;
    return false;
}
void solve()
{
    if(l[1]==1 && verif(k))
    {
        printf("0");
        return;
    }
    int lastpos=0,put=0,rez=1;
    int a[KMAX][KMAX],c[KMAX][KMAX];
    for(int i=1;i<=m;i++)
    {
        put=l[i]-lastpos-1;
        del(a);
        del(c);
        makeidentic(a);
        makerec(c);
        while(put)
        {
            if(put&1)
                inm(a,a,c);
            inm(c,c,c);
            put>>=1;
        }
        lastpos=l[i]+1;
        rez*=a[k][k];
        rez%=MOD;
    }
    put=n-lastpos;
    del(a);
    del(c);
    makeidentic(a);
    makerec(c);
    while(put)
    {
        if(put&1)
            inm(a,a,c);
        inm(c,c,c);
        put>>=1;
    }
    rez*=a[k][k];
    rez%=MOD;
    if(l[m]==n)
    {
        printf("0");
        return;
    }
    printf("%d",rez);
}
int main()
{
    freopen("pod.in","r",stdin);
    freopen("pod.out","w",stdout);
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=m;i++)
        scanf("%d",&l[i]);
    sort(l+1,l+m+1);
    solve();
    return 0;
}