Cod sursa(job #2789161)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 26 octombrie 2021 23:03:28
Problema Kdrum Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f

using namespace std;

ifstream fin("kdrum.in");
ofstream fout("kdrum.out");

const int kN = 50;
const int di[] = {-1, 0, 1, 0}, dj[] = {0, 1, 0, -1};
int n, m, a[1 + kN][1 + kN];
vector<int> dp[1 + kN][1 + kN];

bool ok(const int &i, const int &j) {
  return 1 <= i && i <= n && 1 <= j && j <= m && a[i][j] != 0;
}

void TestCase() {
  int k, x1, y1, x2, y2;
  fin >> n >> m >> k >> x1 >> y1 >> x2 >> y2;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      fin >> a[i][j];
      if (a[i][j] != 0) {
        a[i][j] = __gcd(a[i][j], k);
      }
    }
  }
  vector<int> divs;
  for (int d = 1; d * d <= k; ++d) {
    if (k % d == 0) {
      divs.emplace_back(d);
      if (k / d != d) {
        divs.emplace_back(k / d);
      }
    }
  }
  sort(divs.begin(), divs.end());
  vector<int> rev(k + 1);
  for (size_t i = 0; i < divs.size(); ++i) {
    rev[divs[i]] = i;
  }
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      dp[i][j].assign(divs.size(), INF);
    }
  }
  dp[x1][y1][rev[a[x1][y1]]] = 1;
  queue<tuple<int, int, int>> q;
  q.emplace(x1, y1, a[x1][y1]);
  while (!q.empty()) {
    int i, j, p;
    tie(i, j, p) = q.front();
    q.pop();
    int cost = dp[i][j][rev[p]] + 1;
    for (int dir = 0; dir < 4; ++dir) {
      int iv = i + di[dir], jv = j + dj[dir];
      if (ok(iv, jv)) {
        int newP = __gcd(p * a[iv][jv], k);
        int index = rev[newP];
        if (cost < dp[iv][jv][index]) {
          dp[iv][jv][index] = cost;
          q.emplace(iv, jv, newP);
        }
      }
    }
  }
  fout << dp[x2][y2][divs.size() - 1] << '\n';
}

int main() {
  int tests = 1;
  for (int tc = 1; tc <= tests; ++tc) {
    TestCase();
  }
  fin.close();
  fout.close();
  return 0;
}