Cod sursa(job #29305)

Utilizator devilkindSavin Tiberiu devilkind Data 8 martie 2007 21:50:41
Problema Robotei Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 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);
long int X,Y;
for (i=0;i<modx;i++)
    for (j=0;j<mody;j++)
      {X=(n-1)/modx;
      if ((n-1)%modx>=i) X++;
      Y=(n-1)/mody;
      if ((n-1)%mody>=j) Y++;
      nr[i][j]=X*Y;
      }
}
    
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;
        if (i==x&&j==y)
           {C[k-1]+=nr[i][j]-1;
           C[k]+=1;
           }
         else C[k]+=nr[i][j];
        }
        else C[0]+=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;
}