Cod sursa(job #2244032)

Utilizator NeredesinI am not real Neredesin Data 21 septembrie 2018 21:30:41
Problema Pod Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <algorithm>
#include <memory.h>
#include <iostream>
#include <fstream>

using namespace std;

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

const int MOD = 9901;
const int NMAX = 1e2;

int n, m, k;
int v[1 + NMAX];

struct matrix {
  int v[21][21];

  matrix(int x = 0) {
    memset(v, 0, sizeof(v));
    for(int i = 1; i <= k; i++)
      v[i][i] = x;
  }

  matrix operator*(matrix &x) {
    matrix res;
    for(int i = 1; i <= k; i++) {
      for(int j = 1; j <= k; j++) {
        for(int l = 1; l <= k; l++)
          res.v[i][j] += v[i][l] * x.v[l][j];
        res.v[i][j] %= MOD;
      }
    }

    return res;
  }

  matrix operator^(int p) {
    matrix res(1), aux = (*this);

    while(p) {
      if(p & 1)
        res = res * aux;
        p >>= 1;
        aux = aux * aux;
    }

    return res;
  }
} a, b;

int main()
{
  in >> n >> m >> k;
  for(int i = 1; i <= m; i++)
    in >> v[i];

  sort(v + 1, v + m + 1);
  v[m + 1] = n + 1;

  for(int i = 1; i < k; i++) {
    a.v[i][i + 1] = 1;
    b.v[i][i + 1] = 1;
  }

  a.v[k][1] = 1;
  a.v[k][k] = 1;

  matrix res(1);
  for(int i = 1; i <= m + 1; i++) {
    res = (a ^ (v[i] - 1 - v[i - 1])) * res;
    res = b * res;
  }

  out << res.v[k - 1][k] << '\n';

  in.close();
  out.close();

  return 0;
}