Cod sursa(job #1840456)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 4 ianuarie 2017 14:19:34
Problema Pod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <bits/stdc++.h>

using namespace std;

const int M = 1005, K = 22, Mod = 9901;

int n, m, k, d[M], a[K][K], ans[M], b[K][K], res[K], c[K][K], i;

void initialize()
{
    int i,j;
    for(i=1; i<=k; ++i)
    for(j=1; j<=k; ++j)
    {
        if(j==k) b[i][j] = (i==1 || i==k);
            else b[i][j] = (i==j+1);
        a[i][j] = (i==j);
        res[i] = 0;
    }
}

void inm(int a[K][K], int b[K][K])
{
    int i, j, z;

    for(i=1; i<=k; ++i)
    for(j=1; j<=k; ++j)
    {
        c[i][j] = 0;
        for(z=1; z<=k; ++z)
            c[i][j] += a[i][z] * b[z][j];
    }

    for(i=1; i<=k; ++i)
    for(j=1; j<=k; ++j)
        a[i][j] = c[i][j] % Mod;
}

void pow(int n)
{
    while(n)
    {
        if(n&1) inm(a, b);
        inm(b,b);
        n >>= 1;
    }

    int i,j;
    for(i=1; i<=k; ++i)
    for(j=1; j<=k; ++j)
        res[i] += ans[j] * a[j][i];

    for(i=1; i<=k; ++i) ans[i] = res[i] % Mod;
}

int main()
{
    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", &d[i]);

    d[++m] = n;
    sort(d+1, d+m+1);

    ans[k]=1;

    for(i=1; i<=m; ++i)
    {
        initialize();
        pow(d[i]-d[i-1]);
        if(i<m) ans[k] = 0;
    }

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

    return 0;
}