Cod sursa(job #2241068)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 14 septembrie 2018 18:36:28
Problema Pod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <bits/stdc++.h>

using namespace std;

const int MOD = 9901;
const int MAXM = 1000;
const int MAXK = 20;

inline void mod(int &x) {
    if(x < 0)
        x += MOD;
    if(x >= MOD)
        x -= MOD;
}

int pos[MAXM + 1], k;

int a[MAXK + 1][MAXK + 1], sol[MAXK + 1][MAXK + 1];
int ways[MAXK + 1], aux[MAXK + 1];

inline void multiply(int a[MAXK + 1][MAXK + 1], int b[MAXK + 1][MAXK + 1]) {
    int c[MAXK + 1][MAXK + 1];
    for(int i = 1; i <= k; i++) {
        for(int j = 1; j <= k; j++) {
            c[i][j] = 0;
            for(int p = 1; p <= k; p++) {
                c[i][j] += a[i][p] * b[p][j];
            }
        }
    }
    for(int i = 1; i <= k; i++) {
        for(int j = 1; j <= k; j++) {
            a[i][j] = c[i][j] % MOD;
        }
    }
}

inline void lgput(int b) {
    int i;
    memset(a, 0, sizeof(a));
    for(i = 1; i < k; i++) {
        a[i + 1][i] = 1;
    }
    a[1][k] = 1;
    a[k][k] = 1;
    memset(sol, 0, sizeof(sol));
    for(i = 1; i <= k; i++) {
        sol[i][i] = 1;
    }
    while(b > 0) {
        if(b & 1)
            multiply(sol, a);
        b >>= 1;
        multiply(a, a);
    }
}

int main() {
    FILE *fi, *fout;
    int i, j, n, m;
    fi = fopen("pod.in" ,"r");
    fout = fopen("pod.out" ,"w");
    fscanf(fi,"%d %d %d " ,&n,&m,&k);
    for(i = 1; i <= m; i++) {
        fscanf(fi,"%d " ,&pos[i]);
    }
    sort(pos + 1, pos + m + 1);
    ways[k] = 1;
    for(int p = 1; p <= m; p++) {
        lgput(pos[p] - pos[p - 1]);
        for(i = 1; i < k; i++) {
            aux[i] = 0;
            for(j = 1; j <= k; j++) {
                aux[i] += sol[j][i] * ways[j];
            }
        }
        for(i = 1; i < k; i++) {
            ways[i] = aux[i] % MOD;
        }
        ways[k] = 0;
    }
    lgput(n - pos[m]);
    int ans = 0;
    for(j = 1; j <= k; j++) {
        ans = (ans + sol[j][k] * ways[j]) % MOD;
    }
    fprintf(fout,"%d" ,ans);
    fclose(fi);
    fclose(fout);
    return 0;
}