Cod sursa(job #2924368)

Utilizator robertanechita1Roberta Nechita robertanechita1 Data 30 septembrie 2022 19:11:44
Problema Pod Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, k, M[25][25], sLipsa[1005], mx[25][25], z[25][25], sol[25][25];


void Copy(int a[25][25], int b[25][25]){
    for(int i = 1; i <= k; i++)
        for(int j = 1; j <= k; j++)
            a[i][j] = b[i][j];
}

void InitM(int a[25][25]){
    Copy(a, z);
    for(int i = 1; i < k; i++)
        a[i + 1][i] = 1;
    a[1][k] = 1;
    a[k][k] = 1;
}

void MultMt(int a[25][25], int b[25][25]){
    int c[25][25];
    Copy(c, z);
    for(int i = 1; i <= k; i++)
        for(int j = 1; j <= k; j++){
            c[i][j] = 0;
            for(int l = 1; l <= k; l++)
                c[i][j] = (c[i][j] + a[i][l] * b[l][j]) % 9901;
    }
    Copy(a, c);
}

void LogPow(int a[25][25], int p){
    int id[25][25];
    Copy(id, z);
    for(int i = 1; i <= k; i++)
        id[i][i] = 1;
    while(p){
        if(p & 1)
            MultMt(id, a);
        MultMt(a, a);
        p /= 2;
    }
    MultMt(sol, id);
}

int main()
{
    cin >> n >> m >> k;
    for(int i = 1; i <= m; i++)
        cin >> sLipsa[i];
    sort(sLipsa + 1, sLipsa + m + 1);
    sLipsa[++m] = n + 1;

    for(int i = 1; i < k; i++)
        M[i + 1][i] = 1;
    for(int i = 1; i <= k; i++)
        sol[i][i] = 1;
    for(int i = 1; i <= m; i++){
        InitM(mx);
        LogPow(mx, sLipsa[i] - sLipsa[i - 1] - 1);
        if(i < m) MultMt(sol, M);
    }
    cout << sol[k][k] << "\n";
    fout.close();
    return 0;
}