Cod sursa(job #2924355)

Utilizator robertanechita1Roberta Nechita robertanechita1 Data 30 septembrie 2022 13:38:26
Problema Pod Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 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], sol[25][25];

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

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 MultMt(int a[25][25], int b[25][25]){
    int c[25][25];
    memset(c, 0, sizeof(c));
    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];
    memset(id, 0, sizeof(id));
    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;
}