Cod sursa(job #1828939)

Utilizator SaitamaSaitama-san Saitama Data 14 decembrie 2016 08:46:11
Problema Pod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>

using namespace std;

ofstream fout("pod.out");
int n, m, k;
const int nMax = 1005, kMax = 25;
const int MOD = 9901;
int v[nMax], a[kMax][kMax], b[kMax][kMax], ans[kMax][kMax], c[kMax][kMax];

inline void Read()
{
    int i;
    ifstream fin("pod.in");
    fin >> n >> m >> k;
    for(i = 1; i <= m; i++)
        fin >> v[i];
    sort(v + 1, v + 1 + m);
    v[++m] = n + 1;
    fin.close();
}

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

inline void Init(int a[kMax][kMax])
{
    int i;
    Cpy(a, c);
    for(i = 1; i < k; i++)
        a[i + 1][i] = 1;
    a[1][k] = 1;
    a[k][k] = 1;
}

inline void Mult_Mat(int a[kMax][kMax], int b[kMax][kMax])
{
    int i, j, p, s, aux[kMax][kMax];
    Cpy(aux, c);
    for(i = 1; i <= k; i++)
        for(j = 1; j <= k; j++)
        {
            s = 0;
            for(p = 1; p <= k; p++)
                s = (s + a[i][p] * b[p][j]);
            aux[i][j] = s % MOD;
        }
    Cpy(a, aux);
}

inline void Lg_Pow(int a[kMax][kMax], int p)
{
    int aux[kMax][kMax], i;
    Cpy(aux, c);
    for(i = 1; i <= k; i++)
        aux[i][i] = 1;
    while(p)
    {
        if(p & 1)
        {
            p--;
            Mult_Mat(aux, a);
        }
        p /= 2;
        Mult_Mat(a, a);
    }
    Mult_Mat(ans,aux);
}

inline void Solve()
{
    int i;
    for(i = 1; i < k; i++)
        b[i + 1][i] = 1;
    for(i = 1; i <= k; i++)
        ans[i][i] = 1;
    for(i = 1; i <= m; i++)
    {
        Init(a);
        Lg_Pow(a, v[i] - v[i - 1] - 1);
        if(i < m) Mult_Mat(ans, b);
    }
    fout << ans[k][k] << "\n";
}

int main()
{
    Read();
    Solve();
    fout.close();
    return 0;
}