Cod sursa(job #2694395)

Utilizator evelina.nitoiuNitoiu Evelina evelina.nitoiu Data 9 ianuarie 2021 09:13:23
Problema Pod Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <bits/stdc++.h>
#define MOD 9901
using namespace std;

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

int n,m,k,ans;

int p[1005];
int sol[21][21],tmp[21][21],a[21][21],dp1[21],dp2[21];

void mult(int a[][21], int b[][21])
{
    //initializare
    for(int i=1;i<=k;i++)
    {
        for(int j=1;j<=k;j++)
            tmp[i][j]=0;
    }
    for(int i=1;i<=k;i++)
    {
        for(int j=1;j<=k;j++)
        {
            for(int l=1;l<=k;l++)
                tmp[i][j]+=a[i][l]*b[l][j];
        }
    }
    //impartire prin mod
    for(int i=1;i<=k;i++)
    {
        for(int j=1;j<=k;j++)
            a[i][j]=tmp[i][j]%MOD;
    }
}


void put(int n)
{
    for(int i=0;(1<<i)<=n;i++)
    {
        if((1<<i)&n)
            mult(sol,a);
        mult(a,a);
    }
}

int main()
{
    in>>n>>m>>k;
    for(int i=1;i<=m;i++)
        in>>p[i];
    p[m+1]=n;
    sort(p+1,p+m+1);
    dp2[k]=1;
    for(int i=1;i<=m+1;i++)
    {
        for(int j=1;j<=k;j++)
        {
            for(int l=1;l<=k;l++)
            {
                sol[j][l]=(j==l);
                if(l==k)
                    a[j][l]=(j==1||j==k);
                else
                    a[j][l]=(j==l+1);
                dp1[j]=0;
            }
        }
        put(p[i]-p[i-1]);
        for(int j=1;j<=k;j++)
        {
            for(int l=1;l<=k;l++)
                dp1[j]+=dp2[l]*sol[l][j];
        }
        for(int j=1;j<=k;j++)
            dp2[j]=dp1[j]%MOD;
        if(i!=m+1)
            dp2[k]=0;
    }
    out<<dp2[k];
    return 0;
}