Cod sursa(job #1847393)

Utilizator silkMarin Dragos silk Data 14 ianuarie 2017 16:37:04
Problema Kdrum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <cstdio>
#define VMax 1000000
#define KMax 12000
#define NMax 100

struct abc{ int x,y,z; };
abc COADA[VMax+1];

int dp[NMax+1][NMax+1][NMax+1];
int v[NMax+1][NMax+1];
int t[KMax+1];

int dirx[4]={-1,0,1,0};
int diry[4]={0,1,0,-1};

inline int gcd(int a, int b)
{
    int r;
    while(b) { r=a%b; a=b; b=r; }
    return a;
}

int main(){
    freopen("kdrum.in","r",stdin);
    freopen("kdrum.out","w",stdout);

    int i,j,k,N,M,K,x0,y0,d0,x,y,d,x1,y1,inc,sf;

    scanf("%d %d %d",&N,&M,&K);
    scanf("%d %d %d %d",&x0,&y0,&x1,&y1);
    for(i = 1; i <= N; ++i)
        for(j = 1; j <= M; ++j) scanf("%d",&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;
                }
            }
        }
    }

    printf("%d\n", dp[x1][y1][ t[K] ] );


return 0;
}