Cod sursa(job #1253507)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 1 noiembrie 2014 13:45:10
Problema Pod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <algorithm>
#include <cstdio>
#include <cstring>

#define NMAX 1007
#define KMAX 27
#define mod 9901

using namespace std;

int n, m, K;
int A[NMAX];
int Mati[KMAX][KMAX], Dp[KMAX][KMAX], Ans[KMAX][KMAX];

void inmulteste(int Mat[KMAX][KMAX], int A[KMAX][KMAX]){
    int C[KMAX][KMAX];
    memset(C, 0, sizeof(C));
    for(int i = 0; i < K; ++i)
        for(int j = 0; j < K; ++j)
            for(int k = 0; k < K; ++k)
                C[i][j] = C[i][j] + Mat[i][k] * A[k][j];
    for(int i = 0; i < K; ++i)
        for(int j = 0; j < K; ++j)
            Mat[i][j] = C[i][j] % mod;
}

void Init(){
    for(int i = 1; i < K; ++i)
        Mati[i][i - 1] = 1;
    Mati[0][K - 1] = Mati[K - 1][K - 1] = 1;
}

void pw(int B[KMAX][KMAX], int y){
    int ret[KMAX][KMAX], D[KMAX][KMAX];
    memcpy(ret, B, sizeof(ret));
    memcpy(D, Mati, sizeof(D));
    for(; y ; y >>= 1){
        if(y & 1)
            inmulteste(ret, D);
        inmulteste(D, D);
    }
    memcpy(Ans, ret, sizeof(Ans));
}

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", &A[i]);
    A[++m] = n;
    sort(A + 1, A + m + 1);
    Init();
    Dp[0][K - 1] = 1;
    for(int i = 1; i <= m; ++i){
        pw(Dp, A[i] - A[i - 1]);
        memcpy(Dp, Ans, sizeof(Dp));
        if(i < m)
            Dp[0][K - 1] = 0;
    }
    printf("%d\n", Dp[0][K - 1]);
    return 0;
}