Cod sursa(job #1723108)

Utilizator akaprosAna Kapros akapros Data 29 iunie 2016 18:13:05
Problema Pod Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>
#define maxK 21
#define mod 9901
#define maxM 1002
using namespace std;
int n, m, k, sol[maxK][maxK], v[maxM], mat[maxK][maxK], res[maxK][maxK];
void mul(int a[maxK][maxK], int b[maxK][maxK])
{
    int k, i, j;
    for (i = 0; i < maxK - 1; ++ i)
        for (j = 0; j < maxK - 1; ++ j)
        {
            res[i][j] = 0;
            for (k = 0; k < maxK - 1; ++ k)
                res[i][j] = res[i][j] + a[i][k] * b[k][j];
        }
    for (i = 0; i < maxK - 1; ++ i)
        for (j = 0; j < maxK - 1; ++ j)
            a[i][j] = res[i][j] % mod;
}
void read()
{
    int i;
    freopen("pod.in", "r", stdin);
    scanf("%d %d %d", &n, &m, &k);
    for (i = 1; i <= m; ++ i)
        scanf("%d", &v[i]);
    sort(v + 1, v + m + 1);
    v[++ m] = n;
    sol[1][k] = 1;
}
void lpow(int x)
{
    int i, j;
    memset(mat, 0, sizeof(mat));
    for (i = 1; i <= k; ++ i)
        mat[i][i - 1] = 1;
    mat[1][k] = mat[k][k] = 1;
    for (i = 0; (1 << i) <= x; ++ i)
    {
        if (x & (1 << i))
            mul(sol, mat);
        mul(mat, mat);
    }
}
void solve()
{
    int i;
    for (i = 1; i <= m; ++ i)
    {
        lpow(v[i] - v[i - 1]);
        if (i < m)
            sol[1][k] = 0;
    }
}
void write()
{
    freopen("pod.out", "w", stdout);
    printf("%d", sol[1][k]);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}