Cod sursa(job #2311318)

Utilizator stefantagaTaga Stefan stefantaga Data 2 ianuarie 2019 21:44:13
Problema Kdrum Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>
#define VMax 1000000
#define KMax 12000
#define NMax 100

using namespace std;
struct abc
{
    int x,y,z;
};
abc COADA[VMax+1];
int i,j,k,N,M,K,x0,y0,d0,x,y,d,x1,y1,inc,sf,dp[NMax+1][NMax+1][NMax+1],v[NMax+1][NMax+1],t[KMax+1];
int dirx[4]={-1,0,1,0};
int diry[4]={0,1,0,-1};
ifstream f("kdrum.in");
ofstream g("kdrum.out");
inline int gcd(int a, int b)
{
    int r;
    while(b)
    {
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}
int main()
{
    f>>N>>M>>K;
    f>>x0>>y0>>x1>>y1;
    for(i=1;i<=N;++i)
    {
        for(j=1;j<=M;++j)
        {
            f>>v[i][j];
        }
    }
    for(i=j=1;j<=K;++j)
    {
        if(K%j==0)t[j]=i++;
    }
    dp[x0][y0][t[gcd(v[x0][y0],K)]]=1;
    inc=sf=0;
    COADA[0].x=x0;
    COADA[0].y=y0;
    COADA[0].z=gcd(v[x0][y0],K);
    while(inc<=sf)
    {
        x0=COADA[inc].x;
        y0=COADA[inc].y;
        d0=COADA[inc++].z;
        for(k=0;k<4;++k)
        {
            x=x0+dirx[k];
            y=y0+diry[k];
            if(v[x][y])
            {
                d=gcd(d0*v[x][y],K);
                if(!dp[x][y][t[d]])
                {
                    dp[x][y][t[d]]=dp[x0][y0][t[d0]]+1;
                    COADA[++sf].x=x;
                    COADA[sf].y=y;
                    COADA[sf].z=d;
                }
            }
        }
    }
    g<<dp[x1][y1][t[K]]<<'\n';
    return 0;
}