Cod sursa(job #2514828)

Utilizator hrazvanHarsan Razvan hrazvan Data 26 decembrie 2019 21:58:50
Problema Kdrum Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <cstdio>
#include <cstring>
#define MAXN 50
#define MAXP 5
#define MAXH 100
#define MAXQ 250000
int n, m;
int p[MAXP], np[MAXP], dp;
int ma[MAXN][MAXN][MAXP], xma[MAXN][MAXN];
int d[MAXN][MAXN][MAXH];
int q1[MAXQ], q2[MAXQ], q3[MAXQ], sq, dq;
char on[MAXN][MAXN][MAXH];
int cd[4][2] = {{0, 1},{1, 0},{0, -1},{-1, 0}};

inline int vtn(int *v){
  int i, h = 0;
  for(i = 0; i < dp; i++){
    h = h * np[i] + v[i];
  }
  return h;
}

inline void ntv(int h, int *v){
  int i;
  for(i = dp - 1; i >= 0; i--){
    v[i] = h % np[i];
    h /= np[i];
  }
}

inline int ntn(int h, int *v){
  int w[MAXP], i;
  memset(w, 0, sizeof w);
  ntv(h, w);
  for(i = 0; i < dp; i++){
    w[i] -= v[i];
    if(w[i] < 0)
      w[i] = 0;
  }
  return vtn(w);
}

inline void bell(int xs, int ys, int xf, int yf){
  sq = dq = 0;
  q1[dq] = xs;  q2[dq] = ys;  q3[dq++] = vtn(np);
  memset(d, -1, sizeof d);
  d[xs][ys][vtn(np)] = 1;
  int x, y, h, i, cx, cy, ch;
  while(sq != dq){
    x = q1[sq];  y = q2[sq];  h = q3[sq];
    sq++;
    if(sq == MAXQ)
      sq = 0;
    on[x][y][h] = 0;
    for(i = 0; i < 4; i++){
      cx = x + cd[i][0];
      cy = y + cd[i][1];
      if(cx >= 0 && cx < n && cy >= 0 && cy < m && xma[cx][cy] != 0){
        ch = ntn(h, ma[cx][cy]);
        if(d[cx][cy][ch] == -1 || d[cx][cy][ch] > d[x][y][h] + 1){
          d[cx][cy][ch] = d[x][y][h] + 1;
          if(!on[cx][cy][ch]){
            q1[dq] = cx;  q2[dq] = cy;  q3[dq++] = ch;
            on[cx][cy][ch] = 1;
          }
        }
      }
    }
  }
}

int main(){
  freopen("kdrum.in", "r", stdin);
  freopen("kdrum.out", "w", stdout);
  int k, i, j, ii;
  int xs, ys, xf, yf, x;
  scanf("%d%d%d", &n, &m, &k);
  scanf("%d%d%d%d", &xs, &ys, &xf, &yf);
  xs--;  ys--;  xf--;  yf--;
  for(i = 2; i * i <= k; i++){
    if(k % i == 0){
      p[dp] = i;
      while(k % i == 0){
        k /= i;
        np[dp]++;
      }
      dp++;
    }
  }
  if(k > 1){
    p[dp] = k;
    np[dp] = 1;
    dp++;
  }
  for(i = 0; i < n; i++){
    for(j = 0; j < m; j++){
      scanf("%d", &xma[i][j]);
      for(ii = 0; ii < dp; ii++){
        while(xma[i][j] != 0 && xma[i][j] % p[ii] == 0){
          ma[i][j][ii]++;
          xma[i][j] /= p[ii];
        }
      }
    }
  }
  bell(xs, ys, xf, yf);
  printf("%d", d[xf][yf][0]);
  return 0;
}