Cod sursa(job #261719)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 18 februarie 2009 18:40:35
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <stdio.h>
#include <set>
#include <algorithm>

#define maxn 53
#define maxd 120
#define mp make_pair

using namespace std;

long f[maxn][maxn][maxd];
long v[maxn][maxn], d[maxd];
pair <long, pair<long, long> > c1[100010], c2[100010];
long n, m, i, j, k, x1, y1, x2, y2, l1, l2, x, y, rest, xc, yc, dc, ok, sol, nd, di;
const long d1[]={0, 1, 0, -1};
const long d2[]={1, 0, -1, 0};

int main()
{
    freopen("kdrum.in", "r", stdin);
    freopen("kdrum.out", "w", stdout);
    scanf("%d %d %d", &n, &m, &k);
    scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=m; j++)
        {
            scanf("%d ", &v[i][j]);
        }
    }
    for(i=1; i*i<=k; i++)
    {
        if(k%i==0)
        {
            nd++;
            d[nd]=i;
            if(i!=k/i)
            {
                nd++;
                d[nd]=k/i;
            }
        }
    }
    sort(d+1,d+nd+1);
    for(i=1; i<=nd; i++)
    {
        if(v[x1][y1]%i==0)
        {
            f[x1][y1][i]=1;
            l1++;
            c1[l1]=mp(i, mp(x1, y1) );
        }
    }
    ok=1;
    sol=1;
    while(ok)
    {
        sol++;
        l2=0;
        for(i=1; i<=l1; i++)
        {
            xc=c1[i].second.first;
            yc=c1[i].second.second;
            dc=c1[i].first;
            for(j=0; j<4; j++)
            {
                x=xc+d1[j];
                y=yc+d2[j];
                if(x>0 && x<=n && y>0 && y<=m)
                {
                    for(di=nd; (d[dc]*v[x][y])%d[di]!= 0; di--);
                    if(f[x][y][di]==0)
                    {
                        l2++;
                        f[x][y][di]=1;
                        c2[l2]=mp(di, mp(x, y) );
                        if(x==x2 && y==y2 && di==nd)
                        {
                            ok=0;
                        }
                    }
                }
            }
        }
        for(i=1; i<=l2; i++)
        {
            c1[i]=c2[i];
        }
        l1=l2;
    }   
    printf("%d\n", sol);
    return 0;
}