Cod sursa(job #2244169)

Utilizator lucametehauDart Monkey lucametehau Data 22 septembrie 2018 12:53:06
Problema Pod Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>
#include <algorithm>
#include <cstring>

using namespace std;

ifstream cin ("pod.in");
ofstream cout ("pod.out");

const int MMAX = 1e3;
const int NMAX = 1e6;
const int MOD = 9901;

int n, m, k;

int v[2 + MMAX];
int a[21][21], b[21][21], sol[21][21], tmp[21][21];

void mult(int a[][21], int b[][21]) {
  int c[21][21];
  memset(c, 0, sizeof(c));
  for(int i = 1; i <= k; i++) {
    for(int j = 1; j <= k; j++) {
      for(int l = 1; l <= k; l++)
        c[i][j] = (c[i][j] + a[i][l] * b[l][j]) % MOD;
    }
  }
  memcpy(a, c, sizeof(c));
}

void print(int v[][21]) {
  for(int i = 1; i <= k; i++) {
    for(int j = 1; j <= k; j++)
      cout << v[i][j] << " ";
    cout << "\n";
  }
}

void lgput(int a[][21], int p) {
  int sol[21][21], tmp[21][21];
  memset(sol, 0, sizeof(sol)); memset(a, 0, sizeof(a));
  for(int i = 1; i <= k; i++)
    a[i][i] = 1;
  for(int i = 1; i < k; i++)
    sol[i][i + 1] = 1;
  sol[k][1] = sol[k][k] = 1;
  for(int i = 0; (1 << i) <= p; i++) {
    if((1 << i) & p)
      mult(a, sol);
    mult(sol, sol);
  }
}

int main() {
  cin >> n >> m >> k;
  for(int i = 1; i <= m; i++)
    cin >> v[i];
  v[m + 1] = n + 1;
  sort(v + 1, v + m + 1);
  for(int i = 1; i < k; i++)
    b[i][i + 1] = tmp[i][i + 1] = 1;
  for(int i = 1; i <= k; i++)
    sol[i][i] = 1;
  for(int i = 1; i <= m + 1; i++) {
    lgput(a, v[i] - v[i - 1] - 1);
    mult(a, sol);
    mult(b, a);
    memcpy(sol, b, sizeof(sol));
    memcpy(b, tmp, sizeof(b));
  }
  cout << sol[k - 1][k];
  return 0;
}