Cod sursa(job #28143)

Utilizator devilkindSavin Tiberiu devilkind Data 7 martie 2007 15:29:47
Problema Robotei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <stdio.h>
#include <string.h>
#define NMAX 21
#define MMAX 1001

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;

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 solve()
{
ciclu();
for (i=0;i<modx;i++)
    for (j=0;j<mody;j++)
        compute(i,j);
for (i=1;i<=m;i++)       
    if (C[i]>0) fprintf(g,"%ld %ld\n",i,C[i]);
}

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