Cod sursa(job #2372139)

Utilizator lucametehauDart Monkey lucametehau Data 6 martie 2019 21:45:37
Problema Pod Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>

using namespace std;

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

int n, m, k, ans;

int p[1005];
int v[3][3], sol[3][3], tmp[3][3], a[3][3];

void mult(int a[][3], int b[][3], int c[][3]) {
  for(int i = 1; i <= 2; i++) {
    for(int j = 1; j <= 2; j++) {
      for(int k = 1; k <= 2; k++)
        c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % 9901;
    }
  }
}

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

void init2(int a[][3], int b[][3]) {
  for(int i = 1; i <= 2; i++) {
    for(int j = 1; j <= 2; j++)
      a[i][j] = b[i][j];
  }
}

int fib(int n) {
  if(n <= 2)
    return 1;
  v[1][1] = 0;
  v[1][2] = v[2][1] = v[2][2] = 1;
  n--;
  init2(a, v);
  sol[1][1] = sol[2][2] = 1;
  for(int i = 0; (1 << i) <= n; i++) {
    if((1 << i) & n) {
      init1(tmp);
      mult(sol, a, tmp);
      init2(sol, tmp);
    }
    init1(tmp);
    mult(a, a, tmp);
    init2(a, tmp);
  }
  return sol[2][2];
}

int main() {
  cin >> n >> m >> k;
  for(int i = 1; i <= m; i++)
    cin >> p[i];
  p[m + 1] = n + 1;
  ans = 1;
  for(int i = 0; i <= m; i++)
    ans = ans * fib(p[i + 1] - p[i] - 1) % 9901;
  cout << ans;
  return 0;
}