Cod sursa(job #3217529)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 23 martie 2024 13:51:02
Problema Pod Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <bits/stdc++.h>

#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

///#include <tryhardmode>
///#include <GODMODE::ON>

using namespace std;

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

#define int long long

const int NMAX=25;
const int MOD=9901;

int init[NMAX][NMAX];
int mat[NMAX][NMAX];
int aux[NMAX][NMAX];
int auxy[NMAX];
int dp[NMAX];
int v[NMAX];
int k;

void multiply(int a[NMAX][NMAX],int b[NMAX][NMAX])
{
    int x,i,j;
    int aux2[k][k];
    for(i=0;i<k;i++)
        for(j=0;j<k;j++)
            aux2[i][j]=0;
    for(i=0;i<k;i++)
        for(j=0;j<k;j++)
            for(x=0;x<k;x++)
                aux2[i][j]=(aux2[i][j]+a[i][x]*b[x][j])%MOD;
    for(i=0;i<k;i++)
        for(j=0;j<k;j++)
            a[i][j]=aux2[i][j];
}

void lgput(int b)
{
    int i;
    for(i=0;(1<<i)<=b;i++)
    {
        if(b & (1<<i))
            multiply(mat,aux);
        multiply(aux,aux);
    }
}

signed main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(NULL);
    fout.tie(NULL);

    int n,m,i,j,l;
    fin>>n>>m>>k;
    for(i=1;i<=m;i++)
        fin>>v[i];
    sort(v+1,v+m+1);
    v[++m]=n;
    dp[k-1]=1;
    for(i=1;i<=m;i++)
    {
        for(j=0;j<k;j++)
        {
            for(l=0;l<k;l++)
            {
                if(j==l)
                    mat[j][l]=1;
                else
                    mat[j][l]=0;
                if(l==k-1)
                {
                    if(j==0)
                        aux[j][l]=1;
                    else if(j==k-1)
                        aux[j][l]=1;
                    else
                        aux[j][l]=0;
                }
                else
                {
                    if(j==l+1)
                        aux[j][l]=1;
                    else
                        aux[j][l]=0;
                }
            }
            auxy[j]=0;
        }
        lgput(v[i]-v[i-1]);
        for(j=0;j<k;j++)
        {
            for(l=0;l<k;l++)
            {
                auxy[j]+=1LL*dp[l]*mat[l][j];
                //auxy[j]%=MOD;
            }
            auxy[j]%=MOD;
        }
        for(j=0;j<k;j++)
            dp[j]=auxy[j];
        if(i==m)
        {
            fout<<dp[k-1];
            fin.close();
            fout.close();
            return 0;
        }
        else
            dp[k-1]=0;
    }
    fout<<0;
    fin.close();
    fout.close();
    return 0;
}