Cod sursa(job #28876)

Utilizator devilkindSavin Tiberiu devilkind Data 8 martie 2007 13:41:51
Problema Robotei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <stdio.h>
#include <string.h>
#define NMAX 1001
#define MMAX 666734

FILE *f = fopen("robotei.in","rt"), *g = fopen("robotei.out","wt");

long int offsetx,offsety,newx,newy,modx,mody,n,hash[NMAX][NMAX],nr[NMAX][NMAX];
long int x,y,C[MMAX],len,m,i,j;

struct lista{long int x,y;
             lista *urm;} *vf[NMAX][NMAX];     

void ciclu()
{
long int X,Y;
hash[x][y]=1;
X= (x*x + offsetx)% modx;
Y= (y*y + offsety)% mody;
len=1;
while (!hash[X][Y])
      {
      hash[X][Y]=1;
      X = (X*X + offsetx)% modx;
      Y = (Y*Y + offsety)% mody;
      len++;
      }
if ((x!=X)||(Y!=y)) len=MMAX;
}

void citire()
{
fscanf(f,"%ld %ld",&n,&m);
fscanf(f,"%ld %ld",&x,&y);
fscanf(f,"%ld %ld %ld %ld",&modx,&mody,&offsetx,&offsety);
for (i=0;i<n;i++)
    for (j=0;j<n;j++)
//	nr[ ((i*i)+offsetx) % modx ][ ((j*j) + offsety) % mody]++;
      nr[i % modx][j % mody]++;

}

void compute(long int i, long int j)
{
long int k,X,Y,l;
k=0;
X=i;Y=j;
memset(hash,0,sizeof(hash));
while ((X!=x||Y!=y)&&k<=m&&(!hash[X][Y]))
      {
      k++;
      hash[X][Y]=1;
      X = (X*X + offsetx)% modx;
      Y = (Y*Y + offsety)% mody;
      }
if (hash[X][Y]) return;
l=m-k;
k=l/len+1;
C[k]+=nr[i][j];
//if (i==x&&j==y) {C[k+1]++;C[k]--;}
}
    
void DF(long int x,long int y, long int depth)
{
lista *p;
hash[x][y]=depth;
p=vf[x][y];
while (p)
      {
      if (!hash[p->x][p->y]) DF(p->x,p->y,depth+1);
      p=p->urm;
      }
}

void solve()
{
long int X,Y,l,k;
ciclu();
lista *p;
for (i=0;i<modx;i++)
    for (j=0;j<mody;j++)
        {
        X = (i*i + offsetx)% modx;
        Y = (j*j + offsety)% mody;
        p=new lista;
        p->x=i;
        p->y=j;
        p->urm=vf[X][Y];
        vf[X][Y]=p;
	}
memset(hash,0,sizeof(hash));
DF(x,y,1);
for (i=0;i<=modx;i++)     
    for (j=0;j<mody;j++)
        {   
        k=hash[i][j];
        if (k)
        {
        k--;
        l=m-k;
        k=l/len+1;
        C[k]+=nr[i][j];
        }
        }
for (i=0;i<=m;i++)
    if (C[i]) fprintf(g,"%ld %ld\n",i,C[i]);
}

int main()
{
citire();
solve();
fclose(f);
fclose(g);
return 0;
}