Cod sursa(job #254498)

Utilizator wefgefAndrei Grigorean wefgef Data 7 februarie 2009 12:29:34
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.78 kb
/* (C) bogdan2412 */

#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

#define MAXN 64
#define MAXK 12005

int N, M, K;
int Sx, Sy, Dx, Dy;
int m[MAXN][MAXN];

vector<int> divK;
int revDivK[MAXK];
vector<int> bst[MAXN][MAXN];

#define stare pair<pair<int, int>, int>
#define sx first.first
#define sy first.second
#define sd second
#define make_stare(x, y, d) make_pair(make_pair(x, y), d)
queue<stare> Q;

const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};

inline int gcd(int a, int b)
{
	if (b == 0)
		return a;
	return gcd(b, a % b);
}

int main()
{
	freopen("kdrum.in", "rt", stdin);
	freopen("kdrum.out", "wt", stdout);

	scanf("%d %d %d", &N, &M, &K);
	for (int i = 1; i <= K; i++)
		if (K % i == 0)
			divK.push_back(i),
			revDivK[i] = (int)divK.size() - 1;
	for (int i = 0; i < N; i++)
		for (int j = 0; j < M; j++)
			bst[i][j].resize(divK.size(), 0x3f3f3f3f);

	scanf("%d %d %d %d", &Sx, &Sy, &Dx, &Dy);
	Sx--; Sy--; Dx--; Dy--;

	for (int i = 0; i < N; i++)
		for (int j = 0; j < M; j++)
		{
			scanf("%d", m[i] + j);
			m[i][j] = gcd(m[i][j], K);
		}

	Q.push(make_stare(Sx, Sy, revDivK[m[Sx][Sy]]));
	bst[Sx][Sy][revDivK[m[Sx][Sy]]] = 1;

	for (; !Q.empty(); Q.pop())
	{
		int X = Q.front().sx, Y = Q.front().sy, D = Q.front().sd;
		for (int k = 0; k < 4; k++)
		{
			int _X = X + dx[k];
			int _Y = Y + dy[k];
			if (_X < 0 || _X >= N)
				continue;
			if (_Y < 0 || _Y >= M)
				continue;
			if (m[_X][_Y] == 0)
				continue;

			int _D = revDivK[gcd(divK[D] * m[_X][_Y], K)];
			if (bst[X][Y][D] + 1 < bst[_X][_Y][_D])
			{
				bst[_X][_Y][_D] = bst[X][Y][D] + 1;
				Q.push(make_stare(_X, _Y, _D));
			}
		}
	}

	printf("%d\n", bst[Dx][Dy][divK.size() - 1]);
	return 0;
}