Pagini recente » Cod sursa (job #2221547) | Cod sursa (job #816675) | Cod sursa (job #1077231) | Cod sursa (job #1269927) | Cod sursa (job #28143)
Cod sursa(job #28143)
#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;
}