Pagini recente » Cod sursa (job #108396) | Cod sursa (job #1423341) | Cod sursa (job #358860) | Cod sursa (job #1674774) | Cod sursa (job #2789158)
#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 inside(const short &i, const short &j) {
return 1 <= i && i <= n && 1 <= j && j <= m;
}
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) {
int x;
fin >> x;
a[i][j] = __gcd(x, 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 <= n; ++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, rest;
tie(i, j, rest) = q.front();
q.pop();
int cost = dp[i][j][rev[rest]] + 1;
for (int dir = 0; dir < 4; ++dir) {
int iv = i + di[dir], jv = j + dj[dir];
if (inside(iv, jv)) {
int gcd = __gcd(rest * a[iv][jv], k);
int index = rev[gcd];
if (cost < dp[iv][jv][index]) {
dp[iv][jv][index] = cost;
q.emplace(iv, jv, gcd);
}
}
}
}
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;
}