Cod sursa(job #2244038)

Utilizator NeredesinI am not real Neredesin Data 21 septembrie 2018 21:43:28
Problema Pod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 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 DIM = 21;
const int NMAX = 1e3;

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

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

  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 j1 = 1; j1 <= k; j1++) {
        for(int j2 = 1; j2 <= k; j2++) {
          res.v[i][j1] += v[i][j2] * x.v[j2][j1];
        }

        res.v[i][j1] %= 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;
  }
};

matrix a;
matrix 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;
}