Cod sursa(job #1838098)

Utilizator Vlad_lsc2008Lungu Vlad Vlad_lsc2008 Data 31 decembrie 2016 00:05:38
Problema Pod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <cstdio>
#include <algorithm>
#include <iostream>
#define mod 9901
using namespace std;

int n,m,k;
int lipsa[1010];
int sol[23][23],red[23][23],sup[23][23];

inline void nulify(int a[23][23])
{
    int i,j;
    for(i=1;i<=22;i++)
        for(j=1;j<=22;j++) a[i][j]=0;
}

inline void setsup()
{
    nulify(sup);
    for(int i=1;i<k;i++)
        sup[i+1][i]=1;
    sup[1][k]=1;
    sup[k][k]=1;
}

inline void copi( int a[23][23],int b[23][23])
{
    for(int i=1;i<=k;i++)
        for(int j=1;j<=k;j++)
            a[i][j]=b[i][j];
}

inline void inmult(int a[23][23],int b[23][23])
{
    int aux[23][23];
    nulify(aux);

    int s,l;

    for(int i=1;i<=k;i++)
        for(int j=1;j<=k;j++)
        {
            s=0;
            for(l=1;l<=k;l++) s+=a[i][l]*b[l][j];
            aux[i][j]=s%mod;
        }
    copi(a, aux);
}

inline void upsup(int p)
{
    int i,i2,j,aux[23][23];
    nulify(aux);
    for(i=1;i<=k;i++) aux[i][i]=1;

    for(i=1;i<=p;i<<=1)
    {
        if( i&p ) inmult(aux,sup);
        inmult(sup,sup);
    }
    inmult(sol,aux);
}

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

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

    for(i=1;i<k;i++) red[i+1][i]=1;
    for(i=1;i<=k;i++) sol[i][i]=1;

    for(i=1;i<=m;i++)
    {
        setsup();
        upsup(lipsa[i]-lipsa[i-1]-1);
        if(i<m) inmult(sol,red);
    }

    printf("%d\n",sol[k][k]);

    fclose(stdin);
    fclose(stdout);
    return 0;
}