Cod sursa(job #2639873)

Utilizator rebecca0312Andrei Rebecca rebecca0312 Data 4 august 2020 13:07:45
Problema Pod Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<bits/stdc++.h>
using namespace std;

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

int n,m,k,ans;

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

void init1(int a[][NMAX]){
    for(int i=1;i<=k;i++)
        for(int j=1;j<=k;j++)
            a[i][j]=0;
}

void init2(int a[][NMAX], int b[][NMAX]){
    for(int i=1;i<=k;i++)
        for(int j=1;j<=k;j++)
            a[i][j]=b[i][j]%MOD;
}

void mult(int a[][NMAX], int b[][NMAX]){
    init1(tmp);
    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];
    init2(a, tmp);
}

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

int main(){
    freopen("pod.in","r",stdin);
    freopen("pod.out","w",stdout);
    scanf("%d%d%d", &n, &m, &k);
    for(int i=1;i<=m;i++)
        scanf("%d", &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;
    }
    printf("%d", dp2[k]);
    return 0;
}