Cod sursa(job #3358826)

Utilizator CarenaMironov Cezar Luca Carena Data 20 iunie 2026 20:58:46
Problema Pod Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <cassert>

using namespace std;

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

const int KMAX=20, MOD=9901;
int n, m, k;

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;
    }
}init, mulmat;

matrix lgpow(matrix a, int b)
{
    if(b==1)
        return a;
    matrix p=lgpow(a, b/2);
    if(b%2)
        return p*p*a;
    return p*p;
}

void init_mat()
{
    init={1, k};
    for(int i=0;i<k-1;i++)
        init.mat[0][i]=0;
    init.mat[0][k-1]=1;
    
    mulmat={k, k};
    for(int i=0;i<k;i++)
        for(int j=0;j<k;j++)
            if(j<k-1 && i==j+1)
                mulmat.mat[i][j]=1;
            else if(j==k-1 && (i==0 || i==k-1))
                mulmat.mat[i][j]=1;
            else
                mulmat.mat[i][j]=0;
}

signed main()
{
    in>>n>>m>>k;
    assert(m==0);
    init_mat();
    matrix ans=init*lgpow(mulmat, n);
    out<<ans.mat[0][k-1];
    return 0;
}