Cod sursa(job #2824291)

Utilizator puica2018Puica Andrei puica2018 Data 1 ianuarie 2022 13:06:12
Problema Kdrum Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#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;
}