Cod sursa(job #1900504)

Utilizator hrazvanHarsan Razvan hrazvan Data 3 martie 2017 13:51:14
Problema Pod Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXM 10000
#define MAXK 21
#define MOD 9901
int v[MAXK], p[MAXM + 1], nv[MAXK];
int rm[MAXK][MAXK], m[MAXK][MAXK];
int k;

inline void mult(int m1[MAXK][MAXK], int m2[MAXK][MAXK]){
  int i, j, ii, x;
  int aux[MAXK][MAXK];
  memset(aux, 0, sizeof aux);
  for(i = 0; i < k; i++){
    for(j = 0; j < k; j++){
      x = 0;
      for(ii = 0; ii < k; ii++){
        x += m1[i][ii] * m2[ii][j];
      }
      aux[i][j] = x % MOD;
    }
  }
  for(i = 0; i < k; i++)
    for(j = 0; j < k; j++)
      m1[i][j] = aux[i][j];
}

inline void calcrm(int x){
  int i, j;
  memset(m, 0, sizeof m);
  memset(rm, 0, sizeof rm);
  for(i = 0; i < k - 1; i++){
    m[i + 1][i] = 1;
    rm[i][i] = 1;
  }
  rm[k - 1][k - 1] = 1;
  m[k - 1][k - 1] = 1;
  m[0][k - 1] = 1;
  while(x > 0){
    if(x & 1)
      mult(rm, m);
    mult(m, m);
    x /= 2;
  }
}

inline void mut(int x){
  calcrm(x);
  int i, j, s;
  for(i = 0; i < k; i++)
    nv[i] = 0;
  for(i = 0; i < k; i++){
      s = 0;
    for(j = 0; j < k; j++){
      s += v[j] * rm[j][i];
    }
    nv[i] = s % MOD;
  }
  for(i = 0; i < k; i++)
    v[i] = nv[i];
}

int main(){
  FILE *in = fopen("pod.in", "r");
  int n, m, i, l;
  fscanf(in, "%d%d%d", &n, &m, &k);
  for(i = 0; i < m; i++)
    fscanf(in, "%d", &p[i]);
  fclose(in);
  std::sort(p, p + m);
  p[m] = n;
  v[k - 1] = 1;
  l = 0;
  for(i = 0; i <= m; i++){
    mut(p[i] - l);
    if(p[i] != n)
      v[k - 1] = 0;
    l = p[i];
  }
  FILE *out = fopen("pod.out", "w");
  fprintf(out, "%d", v[k - 1]);
  fclose(out);
  return 0;
}