Cod sursa(job #2372176)

Utilizator lucametehauDart Monkey lucametehau Data 6 martie 2019 22:10:56
Problema Pod Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

int n, m, k, ans;

int p[1005];
int sol[21][21], tmp[21][21], a[21][21], dp1[21], dp2[21];

void init1(int a[][21]) {
  for(int i = 1; i <= k; i++) {
    for(int j = 1; j <= k; j++)
      a[i][j] = 0;
  }
}

void init2(int a[][21], int b[][21]) {
  for(int i = 1; i <= k; i++) {
    for(int j = 1; j <= k; j++)
      a[i][j] = b[i][j] % 9901;
  }
}

void mult(int a[][21], int b[][21]) {
  init1(tmp);
  for(int i = 1; i <= k; i++) {
    for(int j = 1; j <= k; j++) {
      for(int l = 1; l <= k; l++)
        tmp[i][j] += a[i][l] * b[l][j];
    }
  }
  init2(a, tmp);
}


void put(int n) {
  for(int i = 0; (1 << i) <= n; i++) {
    if((1 << i) & n)
      mult(sol, a);
    mult(a, a);
  }
}

int main() {
  cin >> n >> m >> k;
  for(int i = 1; i <= m; i++)
    cin >> p[i];
  p[m + 1] = n;
  sort(p + 1, p + m + 1);
  dp2[k] = 1;
  for(int i = 1; i <= m + 1; i++) {
    for(int j = 1; j <= k; j++) {
      for(int l = 1; l <= k; l++) {
        sol[j][l] = (j == l);
        if(l == k)
          a[j][l] = (j == 1 || j == k);
        else
          a[j][l] = (j == l + 1);
        dp1[j] = 0;
      }
    }
    put(p[i] - p[i - 1]);
    for(int j = 1; j <= k; j++) {
      for(int l = 1; l <= k; l++)
        dp1[j] += dp2[l] * sol[l][j];
    }
    for(int j = 1; j <= k; j++)
      dp2[j] = dp1[j] % 9901;
    if(i != m + 1)
      dp2[k] = 0;
  }
  cout << dp2[k];
  return 0;
}