Cod sursa(job #2486545)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 3 noiembrie 2019 08:38:39
Problema Pod Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int n, m, k, sc;
int poz[1005], v[50];
const int MOD 9901

struct matrice {
  int a[25][25];

  matrice() {
    for(int i = 0; i < 21; i++)
      for(int j = 0; j < 21; j++)
        a[i][j] = 0;
  }

  void afisare() {
    for(int i = 1; i <= k; i++) {
      for(int j = 1; j <= k; j++)
        printf("%d ", a[i][j]);
      printf("\n");
    }
  }

  matrice operator* (const matrice x) {
    matrice rez;

    for(int i = 1; i <= k; i++)
      for(int j = 1; j <= k; j++)
        for(int p = 1; p <= k; p++)
          rez.a[i][j] =  (rez.a[i][j] + (a[i][p] * x.a[p][j]) % MOD) % MOD;
    return rez;
  }

} puteri[55], M, I, sol;

matrice fast_pow(int pow) {
  matrice rez = I;

  for(int i = 0; (1 << i) <= pow; i++)
    if((1 << i) & pow)
      rez = rez * puteri[i];
  return rez;
}

int main() {
  freopen("pod.in", "r", stdin);
  freopen("pod.out", "w", stdout);

  scanf("%d %d %d", &n, &m, &k);
  for(int i = 1; i <= m; i++)
    scanf("%d", &poz[i]);
  sort(poz + 1, poz + m + 1);
  poz[m + 1] = n + 1;

  for(int i = 1; i < k; i++)
    M.a[i + 1][i] = 1;
  M.a[1][k] = M.a[k][k] = 1;
  for(int i = 1; i <= k; i++)
    I.a[i][i] = 1;
  puteri[0] = M;
  for(int i = 1; i <= 50; i++)
    puteri[i] = puteri[i - 1] * puteri[i - 1];

  sol.a[1][k] = 1;
  for(int sc = 1; sc <= m + 1; sc++) {
    matrice mat = fast_pow(poz[sc] - poz[sc - 1]);
    sol = sol * mat;
    sol.a[1][k] = 0;
  }

  printf("%d", sol.a[1][k - 1]);

  return 0;
}