Cod sursa(job #1759770)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 19 septembrie 2016 19:58:42
Problema Pod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

#define MOD 9901
#define MAXN 1000
#define MAXK 20

int v[MAXN+2];
int rez[MAXK+1][MAXK+1], mat[MAXK+1][MAXK+1], k;
int aux[MAXK+1][MAXK+1], sef[MAXK+1], ans[MAXK+1];

inline void lgput(int n){
    int i, j, p;
    memset(rez, 0, sizeof rez);
    memset(mat, 0, sizeof mat);
    for(i=0; i<=k; i++)
        rez[i][i]=1;
    for(i=1; i<=k; i++)
        mat[i][i-1]=1;
    mat[1][k]=mat[k][k]=1;
    while(n){
        if(n%2){
            memset(aux, 0, sizeof aux);
            for(i=1; i<=k; i++)
                for(j=1; j<=k; j++)
                    for(p=1; p<=k; p++)
                        aux[i][j]+=rez[i][p]*mat[p][j];
            for(i=1; i<=k; i++)
                for(j=1; j<=k; j++)
                    rez[i][j]=aux[i][j]%MOD;
        }
        memset(aux, 0, sizeof aux);
        for(i=1; i<=k; i++)
            for(j=1; j<=k; j++)
                for(p=1; p<=k; p++)
                    aux[i][j]+=mat[i][p]*mat[p][j];
        for(i=1; i<=k; i++)
            for(j=1; j<=k; j++)
                mat[i][j]=aux[i][j]%MOD;
        n/=2;
    }
    memset(sef, 0, sizeof sef);
    for(i=1; i<=k; i++)
        for(j=1; j<=k; j++)
            sef[i]+=ans[j]*rez[j][i];
    for(i=1; i<=k; i++)
        ans[i]=sef[i]%MOD;
}

int main(){
    int a, n, i;
    FILE *fin, *fout;
    fin=fopen("pod.in", "r");
    fout=fopen("pod.out", "w");
    fscanf(fin, "%d%d%d", &a, &n, &k);
    for(i=1; i<=n; i++)
        fscanf(fin, "%d", &v[i]);
    std::sort(v+1, v+n+1);
    v[n+1]=a;
    ans[k]=1;
    for(i=1; i<=n+1; i++){
        lgput(v[i]-v[i-1]);
        if(i<=n) ans[k]=0;
    }
    fprintf(fout, "%d\n", ans[k]);
    fclose(fin);
    fclose(fout);
    return 0;
}