Pagini recente » Cod sursa (job #636823) | Cod sursa (job #1704654) | Cod sursa (job #269692) | Cod sursa (job #2735579) | Cod sursa (job #2824291)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("kdrum.in");
ofstream fout("kdrum.out");
int n,m,k;
int l1,c1,l2,c2;
int a[55][55],pos[12005];
vector <int> dp[55][55],divs;
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
bool ok(int i,int j)
{
if(1<=i && i<=n && 1<=j && j<=m && a[i][j]>0)
return 1;
return 0;
}
queue <tuple <int,int,int>> q;
int main()
{
fin>>n>>m>>k;
fin>>l1>>c1>>l2>>c2;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
fin>>a[i][j];
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
if(a[i][j]>0)
a[i][j]=__gcd(a[i][j],k);
for(int d=1; d*d<=k; d++)
{
if(k%d==0)
{
divs.push_back(d);
if(k/d!=d)
divs.push_back(k/d);
}
}
sort(divs.begin(),divs.end());
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
dp[i][j].assign(divs.size(),1e9);
for(int i=0; i<divs.size(); i++)
pos[divs[i]]=i;
dp[l1][c1][pos[a[l1][c1]]]=1;
q.push({l1,c1,a[l1][c1]});
while(!q.empty())
{
int i,j,p;
tie(i,j,p)=q.front();
q.pop();
int c1=dp[i][j][pos[p]]+1;
for(int d=0; d<4; d++)
{
int iv=i+dx[d],jv=j+dy[d];
if(ok(iv,jv))
{
int newp=__gcd(p*a[iv][jv],k);
if(c1<dp[iv][jv][pos[newp]])
{
dp[iv][jv][pos[newp]]=c1;
q.push({iv,jv,newp});
}
}
}
}
fout<<dp[l2][c2][divs.size()-1]<<"\n";
return 0;
}