Cod sursa(job #55703)

Utilizator VmanDuta Vlad Vman Data 28 aprilie 2007 10:51:16
Problema Robotei Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <stdio.h>
#define dimmax 1000
#define Mmax 666733

int N,M,X,Y,modX,modY,offsetX,offsetY,L,dist[dimmax][dimmax],i,j,nr[Mmax];
char w[dimmax][dimmax];

void lungime(int x,int y)
{
int nrp;
x=(x*x+offsetX)%modX;
y=(y*y+offsetY)%modY;
nrp=1;
while (((x!=X)||(y!=Y))&&(nrp<=modX*modY))
      {
      x=(x*x+offsetX)%modX;
      y=(y*y+offsetX)%modY;
      ++nrp;
      }
if ((x!=X)||(y!=Y)) L=0;
   else L=nrp;
}

int dfs(int i,int j)
{
i=(i*i+offsetX)%modX;
j=(j*j+offsetY)%modY;
if ((w[i][j]==1)&&(dist[i][j]==0)) return -(N*N);
if ((i==X)&&(j==Y)) return 0;
   else
   {
   w[i][j]=1;
   if (dist[i][j]==0) dist[i][j]=dfs(i,j)+1;
   }
return dist[i][j];
}

void bfs()
{
int aux;
for (i=0;i<modX;++i)
    for (j=0;j<modY;++j)
	{
	 if (dist[i][j]==0)
	    {
	    if ((i==X)&&(j==Y)) continue;
	    w[i][j]=1;
	    dist[i][j]=dfs(i,j)+1;
	    }
	}
for (i=0;i<modX;++i)
    for (j=0;j<modY;++j)
      if ((dist[i][j]>=0)&&(dist[i][j]<=M))
	{
	 aux=(((N-1-i)/modX)+1)*(((N-1-j)/modY)+1);
     //
     if ((i==X)&&(j==Y))
        {
         if (L!=0)
            {
            nr[(M/L)+1]+=1;
            if (M/L>0) nr[(M/L)]+=aux-1;
               else aux=1;
            }
            else nr[1]+=aux; //??
            nr[0]-=aux;
        continue;
        }
     //
	 if (L!=0) nr[((M-dist[i][j])/L)+1]+=aux;
		else nr[1]+=aux;
	 nr[0]-=aux;
	}
}

int main()
{
 freopen("robotei.in","r",stdin);
 scanf("%d %d %d %d %d %d %d %d",&N,&M,&X,&Y,&modX,&modY,&offsetX,&offsetY);
 fclose(stdin);
 lungime(X,Y);
 freopen("robotei.out","w",stdout);
 nr[0]=N*N;
 if ((X<modX)&&(Y<modY)) bfs();
    else { nr[1]=1;--nr[0]; }
 for (X=0;X<=M;++X)
     if (nr[X]!=0) printf("%d %d\n",X,nr[X]);
 fclose(stdout);
 return 0;
}