Cod sursa(job #2432626)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 24 iunie 2019 15:15:38
Problema Pod Scor 95
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>
#define DEBUG(x) cerr << (#x) << ": " << (x) << '\n'
 
using namespace std;
 
const int MOD = 9901;
 
struct Matrix {
  int n, m;
  vector<vector<int>> a;
  Matrix(int n, int m) : n(n), m(m), a(n, vector<int>(m)) {}
  vector<int>& operator[](const int pos) {
    return a[pos];
  }
  Matrix operator*(Matrix b) const {
    Matrix res(n, b.m);
    assert(m == b.n);
    for (int i = 0; i < n; ++i) {
      for (int k = 0; k < m; ++k) {
        for (int j = 0; j < b.m; ++j) {
          res[i][j] += a[i][k] * b[k][j];
        }
      }
    }
    for (int i = 0; i < n; ++i) for (int j = 0; j < b.m; ++j) if (res[i][j] >= MOD) res[i][j] %= MOD;
    return res;
  }
  Matrix toPow(int e) {
    Matrix res = *this, b = *this;
    --e;
    while (e) {
      if (e & 1)
        res = res * b;
      b = b * b;
      e >>= 1;
    }
    return res;
  }
};
 
int main() {
  ifstream cin("pod.in");
  ofstream cout("pod.out");
  ios::sync_with_stdio(0);
  cin.tie(0);
 
  int n, m, k; cin >> n >> m >> k;
  vector<int> v(m);
  for (int i = 0; i < m; ++i) {
    cin >> v[i];
  }
  sort(v.begin(), v.end()); // ffs
  Matrix tr(k, k);
  for (int i = k - 1; i >= 1; --i) {
    tr[i][i - 1] = 1;
  }
  tr[0][k - 1] = tr[k - 1][k - 1] = 1;
  
  Matrix dp(1, k);
  dp[0][k - 1] = 1;
  
  int last = 0;
  for (int i = 0; i < m; ++i) {
    int e = v[i] - last;
    dp = move(dp * tr.toPow(e));
    dp[0][k - 1] = 0; // dp[v[i]] = 0
    last = v[i];
  }
  dp = move(dp * tr.toPow(n - last));
  cout << dp[0][k - 1] << endl;
 
#ifdef LOCAL_DEFINE
  cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
  return 0;
}