Cod sursa(job #1832593)

Utilizator NineshadowCarapcea Antonio Nineshadow Data 20 decembrie 2016 15:17:50
Problema Pod Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("pod.in");
ofstream out("pod.out");
int n,m,k,v[1001],mod=9901;
struct matrix
{
    int v[21][21];
    matrix(int x = 0)
    {
        memset(v, 0, sizeof(v));
        for(int i=1; i<=k; ++i)
            v[i][i]=x;
    }
    matrix operator*(matrix &x)
    {
        matrix res;
        for (int i=1;i<=k;++i)
            for (int j=1;j<=k;++j)
            {
                for (int l=1;l<=k;++l)
                    res.v[i][j]+=v[i][l]*x.v[l][j];
                res.v[i][j]%=mod;
            }
        return res;
    }
    matrix operator^(int p)
    {
        matrix res(1),aux=(*this);
        while(p)
        {
            if(p&1)res=res*aux;
            p>>=1;
            aux=aux*aux;
        }
        return res;
    }
} a, b;
int main()
{
    in>>n>>m>>k;
    for (int i=1;i<=m;++i)
        in>>v[i];
    sort(v+1,v+m+1);
    v[m+1]=n+1;
    for(int i=1; i<k; ++i)
        a.v[i+1][i]=b.v[i+1][i]=1;
    a.v[1][1]=a.v[1][k]=1;
    matrix res(1);
    for (int i=1;i<=m+1;++i)
    {
        res=(a^(v[i]-1-v[i-1]))*res;
        res=b*res;
    }
    out<<res.v[k][k-1];
    return 0;
}