Pagini recente » Cod sursa (job #2288850) | Cod sursa (job #2957212) | Cod sursa (job #998784) | Cod sursa (job #2929722) | Cod sursa (job #860606)
Cod sursa(job #860606)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <deque>
using namespace std;
#define maxN 55
#define maxK 12010
#define PB push_back
#define MKP make_pair
#define int64 long long
#define f first
#define s second
int A[maxN][maxN], Diiv[maxN + maxN];
int dx[] = {-1, 0, 1, 0}, dy[] = {0, -1, 0, 1};
deque < pair < pair <int, int>, int> > Q;
int Cost[maxN][maxN][maxN + maxN];
int Nrd[maxK];
inline int64 gcd (int64 A, int64 B)
{
if (! B) return A;
return gcd (B, A % B);
}
int main()
{
freopen ("kdrum.in", "r", stdin);
freopen ("kdrum.out", "w", stdout);
int N, M, K;
int x1, y1, x2, y2;
scanf ("%d %d %d", &N, &M, &K);
scanf ("%d %d %d %d", &x1, &y1, &x2, &y2);
for (int i = 1; i <= N; ++ i)
for (int j = 1; j <= M; ++ j) scanf ("%d", &A[i][j]);
for (int i = 1; i <= K; ++ i) if (! (K % i)) Nrd[i] = ++ Nrd[0], Diiv[Nrd[0]] = i;
Q.PB ( MKP ( MKP (x1, y1), Nrd[gcd (K, A[x1][y1])]) );
Cost[x1][y1][Nrd[gcd (K, A[x1][y1])]] = 1;
while (! Q.empty ())
{
int x = Q[0].f.f, y = Q[0].f.s;
int nrDiv = Q[0].s;
Q.pop_front();
for (int t = 0; t < 4; ++ t)
{
int xx = x + dx[t], yy = y + dy[t];
if (xx < 1 || xx > N || yy < 1 || yy > M) continue;
if (! A[xx][yy]) continue;
int diviz = Diiv[nrDiv];
diviz = gcd (diviz * A[xx][yy], K);
if (Cost[xx][yy][Nrd[diviz]]) continue;
Cost[xx][yy][Nrd[diviz]] = Cost[x][y][nrDiv] + 1;
Q.PB ( MKP ( MKP (xx, yy), Nrd[diviz] ) );
}
}
printf ("%d", Cost[x2][y2][Nrd[K]]);
return 0;
}