Cod sursa(job #1771971)

Utilizator dani_mocanuDani Mocanu dani_mocanu Data 6 octombrie 2016 12:46:00
Problema Pod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("pod.in");
ofstream fout("pod.out");
const int nmax = 1005,kmax = 25;
const int mod = 9901;
int N,M,K,v[nmax],a[kmax][kmax],z[kmax][kmax],b[kmax][kmax],ans[kmax][kmax];

inline void Read()
{
    int i;
    fin >> N >> M >> K;
    for(i = 1; i <= M; i++)
        fin >> v[i];
    sort(v+1,v+M+1);
    v[++M] = N + 1;
}

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

inline void Init(int a[kmax][kmax])
{
    int i;
    Cpy(a,z);
    for(i = 1; i < K; i++)
        a[i+1][i] = 1;
    a[1][K] = 1;
    a[K][K] = 1;
}

inline void MultMat(int a[kmax][kmax], int b[kmax][kmax])
{
    int i,j,k,s,aux[kmax][kmax];
    Cpy(aux,z);
    for(i = 1; i <= K; i++)
        for(j = 1; j <= K; j++)
    {
        s = 0;
        for(k = 1; k <= K; k++)
            s = (s + a[i][k]*b[k][j]);
        aux[i][j] = s%mod;
    }
    Cpy(a,aux);
}

inline void LG_Pow(int a[kmax][kmax], int p)
{
    int aux[25][25];
    Cpy(aux,z);
    for(int i = 1; i <= K; i++) aux[i][i] = 1;
    while(p)
    {
        if(p % 2 == 1)
        {
            p--;
            MultMat(aux,a);
        }
        if(p)
        {
            p/=2;
            MultMat(a,a);
        }
    }
    MultMat(ans,aux);
}



inline void Solve()
{
    int i,j;
    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) MultMat(ans,b);
    }
    fout << ans[K][K] << "\n";
}

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