Cod sursa(job #3358149)

Utilizator CarenaMironov Cezar Luca Carena Data 14 iunie 2026 22:19:08
Problema Pod Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream in("pod.in");
ofstream out("pod.out");

const int KMAX=20, LMAX=29, MMAX=1e3+5, MOD=9901;
int n, m, k, v[MMAX];

struct matrix
{
    int di, dj, mat[KMAX][KMAX];
    friend matrix operator*(const matrix &a, const matrix &b)
    {
        matrix c={a.di, b.dj};
        for(int i=0;i<c.di;i++)
            for(int j=0;j<c.dj;j++)
            {
                c.mat[i][j]=0;
                for(int k=0;k<a.dj;k++)
                    c.mat[i][j]=(c.mat[i][j] + a.mat[i][k]*b.mat[k][j]%MOD)%MOD;
            }
        return c;
    }
}dp, mpow[LMAX];

void init_mat()
{
    dp={1, k}; mpow[0]={k, k};
    
    dp.mat[0][k-1]=1;
    for(int i=0;i<k-1;i++)
        mpow[0].mat[i+1][i]=1;
    mpow[0].mat[0][k-1]=mpow[0].mat[k-1][k-1]=1;
    
    for(int i=1;i<=LMAX;i++)
        mpow[i]=mpow[i-1]*mpow[i-1];
}

void advance(int d)
{
    while(d)
    {
        int b=31-__builtin_clz(d&-d);
        dp=dp*mpow[b];
        d^=(d&-d);
    }
}

int main()
{
    in>>n>>m>>k;
    for(int i=1;i<=m;i++)
        in>>v[i];
    sort(v+1, v+m+1);
    
    init_mat();
    for(int i=1;i<=m;i++)
    {
        advance(v[i]-v[i-1]);
        dp.mat[0][k-1]=0;
    }
    advance(n-v[m]);
    out<<dp.mat[0][k-1];
    return 0;
}